Calling objects like methods in ruby
调用像方法这样的对象是否可能(无论如何,无论多么奇怪或丑陋)。我不是在谈论方法对象或调用对象的方法,我的意思是:
1 2 3 4 5 6 7 8 9 10
| class Klass
def callMeMethod *args
p args
end
end
myObject = Klass.new
myObject *args #=> [arg0, arg1, ...]
myObject(*args) #=> [arg0, arg1, ...] |
我曾考虑过每次创建对象时都定义一个新的全局方法(不必担心有多糟糕),但我遇到了问题,而且理想情况下,我希望调用它,即使它是从以下表达式返回的:
1 2
| someArray[index_of_my_object] *args #=> [arg0, arg1, ...]
someArray[index_of_my_object](*args) #=> [arg0, arg1, ...] |
所以基本上是python的__call__方法。
谢谢
- think it's of your interest stackoverflow.com/questions/35400337/ruby send vs call metho‌&误8203;d
- 不,我说的是像调用方法一样调用对象(object variable # => result)
- 实现#call和#[]方法,就像Proc和Method一样。我认为这在Ruby中更自然。
- 是的,是的,更自然的是很好的,我知道我可以定义方法,我说的是一个非常具体的东西,据我所知,它完全违背了Ruby方法的概念,但我确信有一种方法可以将它拼凑在一起
- 我觉得你走错了。当你和Ruby一起工作时,不要试图让它表现得像其他语言一样。你为什么要这样做?
- 一部分是因为我应该能够,另一部分是因为做一些无用和荒谬的事情能帮助我更好地理解语言。
- 我认为你不可能,否则你可能不会有像Kernel中的#Array这样的方法。.()是.call的糖,所以你可以说proc.(6)和proc.call(6)是一样的。在我看来,理解Ruby的方法是用Ruby编程,而不是用Ruby编程python。
- 那只是墨守成规。你对正式编程是正确的,但是发现奇怪的黑客是一个很好的方式来欣赏语言如何像中缀操作符那样工作,这可能是很简单的,但这是学习重载的一个好方法。
- 我想你可以用呼叫者和method_missing的绑定来实现。不过,我认为用纯红宝石是不可能的。
- 谢谢,但这并不是重点,正如你所说,这个想法完全没有意义,我只想知道是否以及如何才能做到这一点。.()离得太近了,但那个点在烦我。
不。
这已经被问了很多次,很多次,很多年了。
YehudaKatz写了一篇关于Ruby的博客文章,标题是Ruby不是一种面向调用的语言(它是面向对象的),这个标题说明了Ruby社区对此的看法。Ruby以对象为中心,而不是函数。消息发送是基本操作,而不是函数调用。
没有显式接收器的消息发送和函数调用之间存在歧义。scala通过静态类型来解决这种歧义,但是ruby不能解决,因此歧义只通过不进行函数调用来解决,或者使用不同的函数调用语法(foo.(bar)而不是foo(bar)来解决。