论坛首页 编程语言技术论坛

怪异的ruby

浏览 4809 次
锁定老帖子 主题:怪异的ruby
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-17  
def a
   puts "hello"
end
dict = {'a'=>a}

大家猜执行结果是什么?
竟然打出了hello!也就是在放到dict的时候进行了运算。而我只是想把这个function放到hash中,以后再进行处理。后来通过伟大的google发现了解决办法。即:
def a
	puts 'hello'
end
b = {'aa'=>self.method(:a);}
b.each do |key,value|
	value.call
end	

哪位高ren(这个词竟然是违禁的!)能解释一下ruby为何这样设计?
   发表时间:2006-08-17  
首先免高,兄弟我对ruby也不是很熟
这个是因为ruby方法调用时如果没有参数允许免括号带来的吧,是为一致性付出的代价
{'a' => a}的时候解释器判决为a的函数调用了
0 请登录后投票
   发表时间:2006-08-17  
好像也不是
b = {'aa'=>a}

b={'aa'=>a()}
的结果是不一样的

比如下面的例子:
def b
	10
end	
c = {'a'=>b}
c.each do |key,value|
	puts value.class
end	
0 请登录后投票
   发表时间:2006-08-18  
albert_qhd 写道
好像也不是
b = {'aa'=>a}

b={'aa'=>a()}
的结果是不一样的


a和a()是一样的,都是执行a,不知道你的例子哪里证明不同了? ruby这么设计如charon所说就是为了省括号(不仅仅是没有参数的时候)。
0 请登录后投票
   发表时间:2006-08-18  
def b
	10
end	
c = {'a'=>b,'a1'=>b();}
c.each do |key,value|
	puts value.class
end	

结果是
Hash
Fixnum

c中第二个对的值是一个数(10),而第一个对的值不是一个数
0 请登录后投票
   发表时间:2006-08-18  
你的变量b可能被污染了吧(和函数b重名)。
新开一个irb,结果如下:
irb(main);:001:0> def b
irb(main);:002:1>     10
irb(main);:003:1> end
=> nil
irb(main);:004:0> c = {'a'=>b,'a1'=>b();}
=> {"a"=>10, "a1"=>10}
irb(main);:005:0> c.each do |key,value|
irb(main);:006:1*     puts value.class
irb(main);:007:1> end
Fixnum
Fixnum
=> {"a"=>10, "a1"=>10}


irb(main);:008:0> b = {'dd'=>11}
=> {"dd"=>11}
irb(main);:009:0> c = {'a'=>b,'a1'=>b();}
=> {"a"=>{"dd"=>11}, "a1"=>10}
irb(main);:010:0> c.each do |key,value|
irb(main);:011:1*     puts value.class
irb(main);:012:1> end
Hash
Fixnum
=> {"a"=>{"dd"=>11}, "a1"=>10}

请注意008行之后的部分(结果和你的一样)。说明ruby对变量名和方法名是分开存放的,对于单独的不带参数的标识符,首先查找的是变量部分,如果找到则返回变量,没找到就继续到方法名中去找,找到则执行这个方法。
所以,ruby是允许变量和函数重名的,但是因为它可以省略函数调用的括号,在无参情况下需要命名冲突解决的判决机制,这个判决机制导致了变量优先(有参情况下括号的省略不会引起这个问题)
在这一点上,python做得比ruby自然一些. 没有分开的存放空间,重名即覆盖.
0 请登录后投票
   发表时间:2006-08-18  
唉,弱智错误!多谢指教
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics