我有几个关于Ruby的方法,程序和块的问题让我觉得奇怪.它们与语法或功能的关系不如决策背后的逻辑.
问题1:
为什么块可以传递给方法(例如每个)但是它们不能分配给变量?
我知道你可以在程序中传递它们,即p = Proc.new {...}
(使用&p
),但是让程序员通过这些方法没有多大意义.
问题2:
为什么方法和程序之间存在差异?
例如,我可以通过以下两种方式完成定义函数和调用该函数的任务:
def square(x)
x**2
end
square(3)
=> 9
Run Code Online (Sandbox Code Playgroud)
要么
square = lambda {|x| x**2}
square.call(3)
=> 9
Run Code Online (Sandbox Code Playgroud)
为什么要分化?例如,在Python中以标准方式定义函数,并square = lambda x: x**2
完成创建函数和分配函数的相同任务square
.
Pin*_*hle 21
问题1:块不是对象,它们是句法结构; 这就是他们无法分配给变量的原因.这是为对象保留的权限.
问题2:方法不是对象,因此无法接收消息.相反,procs和lambdas是对象,因此它们不能像方法一样调用,但必须接收一条消息,告诉它们根据随消息传递的参数返回一个值.
Procs和Lambdas是对象,因此它们可以接收call
消息并分配给名称.总而言之,它是一个使procs和lambdas以你发现奇怪的方式表现的对象.方法和块不是对象,也不共享该行为.
至少在某种程度上,方法是对象:
class ABC
def some_method
end
end
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method>
Run Code Online (Sandbox Code Playgroud)
除此之外,还有一个内置类:Method,如此处所述.
另见:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls
同时<bseg>
,它确实似乎证实了一切都是对象的东西.在这种特殊情况下,它似乎需要更多的挖掘才能看到.
(我真的必须努力更好地理解这一点:我开始认为这是获得更深入理解的基础.)
归档时间: |
|
查看次数: |
9772 次 |
最近记录: |