为了账号安全,请及时绑定邮箱和手机立即绑定

ruby block问题

ruby block问题

德玛西亚99 2019-04-14 11:21:18
做七周七语言ruby第二天习题的时候要实现一个简单的Tree类,以下代码可以运行,但是把children.each{|c|c.visit_all(n+1){|node|puts"-#{node.node_name}"}}这行的{|node|puts"-#{node.node_name}"}改成&block就跑不起来,请问是为什么?#!/usr/bin/rubyclassTreeattr_accessor:children,:node_namedefinitialize(tree)tree.eachdo|key,value|@node_name=key@children=value.map{|(key,value)|Tree.new(key=>value)}endenddefvisit_all(n,&block)visit&blockprint''*nchildren.each{|c|c.visit_all(n+1){|node|puts"-#{node.node_name}"}}enddefvisit(&block)block.callselfendendruby_tree=Tree.new({'grandpa'=>{'day'=>{'child1'=>{},'child2'=>{}},'uncle'=>{'child3'=>{},'child4'=>{}}}})ruby_tree.visit_all(1){|node|puts"-#{node.node_name}"}ps:ruby环境是2.1.3
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

每行代码执行的时候都有一个上下文,在上下文中存储着这行代码可以访问的一些变量。块可以访问定义时的上下文,在你的例子中这个块定义在全局,所以可以访问到全局变量,不过这里的全局变量只有ruby_tree(也有一些语言内置的就不说了)。但是没有block这个变量,所以在块内是不能访问的,会报类似不变量或方法存在的错误。
换一个解译,如果用远古的C语言类似的例子说的话,就是block这个变量是个实参,而你在块中要使用与其对待的形参node这个变量。
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 392 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号