我注意到jbuilder
的文档:https://github.com/rails/jbuilder
json.(@message, :created_at, :updated_at)
我已经使用jbuilder
在一些代码中对此进行了测试,它似乎与此同义:
json.created_at(@message.created_at)
json.updated_at(@message.updated_at)
但我之前从未遇到过这种语法,并且从未在任何其他ruby或rails文档中看到过这样的事情。 ruby中的这个功能记录在哪里? 究竟是做什么的,有什么警告呢?
编辑:
在第一个答案之后,我现在怀疑json
对象看起来像这样,并实现了call
方法:
class FakeJson
def initialize
end
def call(obj, *methods)
methods.each do |method|
self.public_send(method, obj.public_send(method))
end
end
def method_missing(*args)
puts "called method with #{args.inspect}"
end
end
答案 0 :(得分:1)
记录在案here,
prc。()使用给定的参数调用prc.call()。隐藏“呼叫”是一种语法糖。
它的工作原理如下:
->x, y, z{x + y + z}.(1, 2, 3)
# => 6
我猜json
是一个proc或其他一个定义了call
的对象,它是call
- 带有三个参数@message
,{{1} }和:created_at
。
答案 1 :(得分:1)
一般来说,你希望看到一个点'。'在方法名称之前:
"Hello".index("e")
其中index是方法的名称,“e”是所述方法的参数。碰巧我使用了括号,但这不是必需的:
"Hello".index "e"
所以你认为在你所指的情况下,那个()是方法的名称并不完全正确。这只是语法糖。
对于Proc对象(或实现#call的一般对象), obj.(args)
等同于obj.call(args)
或甚至(仅在真正的Proc的情况下){{1} }。