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

做七周七语言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リーリー

答え

トピックに従って15行目を報告します

リーリー

に変更されました リーリー

以降、プログラムの出力結果は一貫しています。

結論

問題は存在しません。

いいねを押す+0
    Ty80

    コードの各行には実行時にコンテキストがあり、このコード行でアクセスできるいくつかの変数はコンテキストに保存されます。ブロックは、定義時にコンテキストにアクセスできます。このブロックはグローバルに定義されているため、グローバル変数にアクセスできます。ただし、ここでのグローバル変数は、ruby_tree だけです (一部の言語には組み込みの変数もあります)。言及しません)。ただし、ブロック変数がないため、ブロック内でアクセスすることはできず、不変式やメソッドが存在する場合と同様のエラーが報告されます。

    別の説明として、古代の C 言語の同様の例を使用すると、変数ブロックは実パラメータであり、ブロック内でそれを扱う仮パラメータ ノード変数を使用する必要があります。

    いいねを押す+0
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!