浏览 4813 次
锁定老帖子 主题:怪异的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为何这样设计? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-08-17
首先免高,兄弟我对ruby也不是很熟
这个是因为ruby方法调用时如果没有参数允许免括号带来的吧,是为一致性付出的代价 {'a' => a}的时候解释器判决为a的函数调用了 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2006-08-18
albert_qhd 写道 好像也不是
b = {'aa'=>a} 和 b={'aa'=>a()} 的结果是不一样的 a和a()是一样的,都是执行a,不知道你的例子哪里证明不同了? ruby这么设计如charon所说就是为了省括号(不仅仅是没有参数的时候)。 |
|
返回顶楼 | |
发表时间: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),而第一个对的值不是一个数 |
|
返回顶楼 | |
发表时间: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自然一些. 没有分开的存放空间,重名即覆盖. |
|
返回顶楼 | |
发表时间:2006-08-18
唉,弱智错误!多谢指教
|
|
返回顶楼 | |