ruby block问题
PHP中文网
PHP中文网 2017-04-24 09:11:17
0
2
609

做七周七语言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中文网

认证高级PHP讲师

membalas semua(2)
小葫芦

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.

Ty80

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan