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

做七周七语言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讲师

全部回覆(2)
小葫芦

訂正

題主給的程序有點小錯誤,訂正後如下,注意 visit &blockprint ' ' * n 兩行的順序:

#!/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}" }

回答

將第15行依題主意思由

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

改為

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

後,程式輸出結果是一致的。

結論

問題不存在。

Ty80

每行程式碼執行的時候都有一個上下文,在上下文中儲存著這行程式碼可以存取的一些變數。區塊可以存取定義時的上下文,在你的例子中這個區塊定義在全局,所以可以存取到全域變量,不過這裡的全域變數只有ruby_tree(也有一些語言內建的就不說了)。但是沒有block這個變量,所以在區塊內是不能存取的,會報類似不變量或方法存在的錯誤。

換一個解譯,如果用遠古的C語言類似的例子說的話,就是block這個變數是個實參,而你在區塊中要使用與其對待的形參node這個變數。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!