gpt4 book ai didi

ruby - Ruby 的 .() 运算符如何工作?

转载 作者:数据小太阳 更新时间:2023-10-29 06:25:40 25 4
gpt4 key购买 nike

我最近遇到了 some code使用由格式 object.(arg1, arg2) 组成的方法调用,但没有看到对其工作原理的很好解释。请参阅此示例代码:

class TestServiceObject
def call
'method'
end
end

TestServiceObject.new.()
# => 'method'

这种速记的术语是什么?

最佳答案

点括号表示法是将参数传递给隐式 call 的简写方式。 Ruby 对象上的方法:

foo = lambda {|bar| puts bar}

foo.call('baz')
#=> baz
foo.('baz')

foo.call('baz') === foo.('baz')
#=> true

另请注意,以下符号也是 call 方法的有效(等效)调用:

foo['baz']
#=> baz
foo::('baz')
#=> baz

在您的示例中,您显式覆盖TestServiceObject 类的call 方法,以便它返回字符串'方法' 调用时。因此,您可以显式覆盖 call 方法以接受参数:

class TestServiceObject
def call(foo=nil)
foo || 'method'
end
end

TestServiceObject.new.()
#=> method
TestServicesObject.new.('bar')
#=> bar

更新:

作为评论者@LoganSerman请注意,速记运算符似乎可以处理任何响应 call 的操作,以下示例部分验证了这一点:

m = 12.method("+")

m.call(3)
#=> 15
m.(3)
#=> 15

更新 2:

作为评论者@Stefan也从the documentation on Proc#call中指出:

prc.() invokes prc.call() with the parameters given. It’s a syntax sugar to hide “call”.

关于ruby - Ruby 的 .() 运算符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19108550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com