Rumah  >  Soal Jawab  >  teks badan

ruby block问题

做七周七语言ruby第二天习题的时候要实现一个简单的Tree类,以下代码可以运行,但是把
children.each {|c| c.visit_all(n+1) {|node| puts "-#{node.node_name}"}}
这行的{|node| puts "-#{node.node_name}"}改成&block就跑不起来,请问是为什么?

#!/usr/bin/ruby
class Tree
  attr_accessor :children,:node_name

  def initialize(tree)
    tree.each do |key,value|
      @node_name = key
      @children = value.map {|(key,value)| Tree.new(key => value)}
    end
  end

  def visit_all(n,&block)
    visit &block
    print '  ' * n
    children.each {|c| c.visit_all(n+1) {|node| puts "-#{node.node_name}"}}
  end

  def visit(&block)
    block.call self
  end

end

ruby_tree = Tree.new({
    'grandpa' => {
        'day' => {'child 1' => {},'child 2' => {}},'uncle' => {'child 3' => {},'child 4' => {}}
    }
})

ruby_tree.visit_all(1) {|node| puts "-#{node.node_name}"}

ps: ruby环境是2.1.3

PHP中文网PHP中文网2709 hari yang lalu540

membalas semua(2)saya akan balas

  • 高洛峰

    高洛峰2017-04-24 09:13:17

    Pembetulan

    Atur cara yang diberikan oleh penyoal mempunyai sedikit kesilapan Pembetulan adalah seperti berikut

    #!/usr/bin/ruby
    class Tree
      attr_accessor :node_name, :children
    
      def initialize(tree)
        tree.each do |key, value|
          @node_name = key
          @children = value.map { |key, value| Tree.new(key => value) }
        end
      end
    
      def visit_all(n = 0, &block)
        print '  ' * n
        visit &block
        children.each { |c| c.visit_all(n+1) { |node| puts "-#{node.node_name}" } }
      end
    
      def visit(&block)
        block.call self
      end
    end
    
    ruby_tree = Tree.new({
      'grandpa' => {
        'dad' => { 'child 1' => {},'child 2' => {} },
        'uncle' => { 'child 3' => {},'child 4' => {} }
      }
    })
    
    ruby_tree.visit_all { |node| puts "-#{node.node_name}" }
    visit &blockJawapanprint ' ' * n

    Tulis semula baris 15 mengikut topik

        children.each { |c| c.visit_all(n+1) { |node| puts "-#{node.node_name}" } }

    ditukar kepada

        children.each { |c| c.visit_all(n+1, &block) }
    Selepas

    , hasil keluaran program adalah konsisten.

    Kesimpulan

    Masalahnya tidak wujud.

    balas
    0

  • PHP中文网

    PHP中文网2017-04-24 09:13:17

    Setiap baris kod mempunyai konteks apabila ia dilaksanakan dan beberapa pembolehubah yang boleh diakses oleh baris kod ini disimpan dalam konteks. Blok boleh mengakses konteks apabila ia ditakrifkan Dalam contoh anda, blok ini ditakrifkan secara global, jadi anda boleh mengakses pembolehubah global Walau bagaimanapun, satu-satunya pembolehubah global di sini ialah ruby_tree (terdapat juga pembolehubah terbina dalam beberapa bahasa, yang saya. tidak akan menyebut). Walau bagaimanapun, tiada pembolehubah blok, jadi ia tidak boleh diakses dalam blok, dan ralat yang serupa dengan kewujudan invarian atau kaedah akan dilaporkan.

    Secara lain, jika kita menggunakan contoh yang serupa daripada bahasa C purba, blok pembolehubah ialah parameter sebenar dan anda perlu menggunakan pembolehubah nod parameter formal untuk merawatnya dalam blok.

    balas
    0
  • Batalbalas