【问题标题】:Calling objects like methods in ruby在 ruby​​ 中调用对象之类的方法
【发布时间】:2017-04-15 11:23:30
【问题描述】:

是否可以(以任何方式,无论多么奇怪或丑陋)像方法一样调用对象。 我不是在谈论方法对象或调用对象的方法,我的意思是:

class Klass
  def callMeMethod *args
    p args
  end
end

myObject = Klass.new

myObject *args  #=> [arg0, arg1, ...]
myObject(*args) #=> [arg0, arg1, ...]

我考虑过在每次创建对象时定义一个新的全局方法(不管这有多糟糕),但我遇到了问题,即使它是从某些表达式返回的,我也希望调用它:

someArray[index_of_my_object] *args  #=> [arg0, arg1, ...]
someArray[index_of_my_object](*args) #=> [arg0, arg1, ...]

所以基本上是 Python 的 __call__ 方法。

谢谢

【问题讨论】:

  • 不,我说的是像调用方法一样调用对象 (object variable # => result)
  • 实现#call#[]方法,就像ProcMethod一样。我认为这将是 Ruby 中更自然的界面。
  • 是的,是的,更自然是好的,我知道我可以定义方法,我说的是一个非常具体的事情,据我所知,它完全违反了 ruby​​ 方法的概念,并且但我确信有办法将它破解在一起
  • 我认为您在这里采用了错误的方法。在使用 Ruby 时编写 Ruby,不要试图让它表现得像其他语言。为什么需要这样做?

标签: ruby methods call


【解决方案1】:

没有。

多年来,这个问题已经被问过很多次了。

Yehuda Katz 写了一篇关于它的博客文章,标题为 Ruby is NOT a Callable Oriented Language (It's Object Oriented),标题几乎说明了 Ruby 社区对此的看法。 Ruby 以对象为中心,而不是函数。消息发送是基本操作,不是函数调用。

在没有明确接收者的消息发送和函数调用之间存在歧义。 Scala 使用静态类型解决了这种歧义,但 Ruby 无法做到这一点,因此可以通过不进行函数调用或使用不同的函数调用语法(foo.(bar) 而不是 foo(bar))简单地解决歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2020-01-19
    • 2011-11-28
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多