>  Q&A  >  본문

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中文网2710일 전542

모든 응답(2)나는 대답할 것이다

  • 高洛峰

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

    수정

    질문자가 제시한 프로그램에 약간의 오류가 있어 수정합니다. visit &block, print ' ' * n행 순서에 주의하세요. 으아악

    답변

    주제에 따라 15행을 다시 작성합니다

    으아악

    으로 변경되었습니다. 으아악

    이후 프로그램 출력 결과는 일관됩니다.

    결론

    문제가 존재하지 않습니다.

    회신하다
    0
  • PHP中文网

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

    각 코드 줄은 실행될 때 컨텍스트를 가지며, 이 코드 줄에서 액세스할 수 있는 일부 변수는 컨텍스트에 저장됩니다. 블록은 정의되면 컨텍스트에 액세스할 수 있습니다. 따라서 전역 변수에 액세스할 수 있습니다. 그러나 여기서 유일한 전역 변수는 ruby_tree입니다(일부 언어에는 내장 변수도 있습니다). 언급하지 않겠습니다) 다만, 블록 변수가 없어 블록 내에서 접근할 수 없으며, 불변값이나 메소드 존재와 유사한 오류가 보고됩니다.

    다른 말로 하면, 고대 C 언어의 비슷한 예를 사용한다면 변수 블록은 실제 매개변수이고 이를 블록 내에서 처리하려면 형식 매개변수 노드 변수를 사용해야 합니다.

    회신하다
    0
  • 취소회신하다