做七周七语言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
Pembetulan
Atur cara yang diberikan oleh penyoal mempunyai sedikit kesilapan Pembetulan adalah seperti berikut
visit &block
Jawapanprint ' ' * n
Tulis semula baris 15 mengikut topikSetiap 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.