【发布时间】:2015-01-01 15:59:30
【问题描述】:
考虑以下代码:
class Emotion
def confused?
def confused?
'yes'
end
'no'
end
end
am_i = Emotion.new
am_i.confused? # => "no"
am_i.confused? # => "yes"
5.times.map { Emotion.new.confused? } # => ["yes", "yes", "yes", "yes", "yes"]
解释:
- 第一次运行
confused?返回"no"并重新定义自身。 - 第二次运行
confused?会调用返回"yes"的新方法。
虽然上述功能很清楚,但我不确定这两种方法是如何定义到相同的范围的。
我问的原因是因为:
- 不能在方法内部和外部以类似的方式访问变量;例如:如果我在方法内部和外部定义
@variable,则它具有不同的含义。 - 我了解到方法定义更改
self。confused?方法的内部定义与外部定义相比,不会有不同的范围吗? -
def如何实际确定在哪里定义方法?
【问题讨论】:
-
Ruby 没有嵌套方法。当您第一次调用该方法时,它会执行其主体并定义第二个方法。下次调用该方法时,您会得到不同的结果,因为内部方法已定义,并且具有优先权。正如前面评论中提到的,Emotion.new.confused 将始终返回“no”。
-
我在 ruby 2.2.0 上实际测试过这个,
loop { p Emotion.new.confused? }打印出"no",然后是"yes"的流。
标签: ruby metaprogramming