Ruby on rails 这个语法是如何工作的:object。(变量,:symbol1,:symbol2)

Ruby on rails 这个语法是如何工作的:object。(变量,:symbol1,:symbol2),ruby-on-rails,ruby,syntax,jbuilder,Ruby On Rails,Ruby,Syntax,Jbuilder,我注意到在jbuilder的文档中: 我自己用jbuilder在一些代码中对此进行了测试,它似乎与此同义: json.created_at(@message.created_at) json.updated_at(@message.updated_at) 但我以前从未遇到过这种语法,也从未在任何其他ruby或rails文档中见过这种语法。ruby中的这个特性在哪里有文档记录?它到底在做什么,有什么警告 编辑: 在第一个答案之后,我现在怀疑json对象看起来像这样,并实现了call方法: cla

我注意到在
jbuilder
的文档中:

我自己用
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
据记载

prc。()使用给定的参数调用prc.call()。隐藏“呼叫”是一种语法糖分

它的工作原理如下:

->x, y, z{x + y + z}.(1, 2, 3)
# => 6

我猜
json
是一个proc或某个其他对象,在其上定义了
call
,它是
call
,带有三个参数
@message
:created_at
:updated_at
,通常您希望在方法名称之前看到一个点“.”

"Hello".index("e")
其中index是方法的名称,“e”是所述方法的参数。碰巧我用了括号,但这不是必需的:

"Hello".index "e"
因此,您可能会认为,在您所引用的示例中,()是方法的名称,但这并不完全正确。只是语法上的糖


对于Proc对象(或实现#call的常规对象),
obj.(args)
相当于
obj.call(args)
甚至(仅在真正的Proc中)
obj[args]

Oh!我想我现在明白了。JBuilder在创建json输出的块中有自己的DSL。我认为
json
对象可能看起来像(我在上面的编辑)json是proc,而不是@message它实际上不是proc,它只是实现
调用
方法。谢谢你给我指明了正确的方向!这确实是语法上的甜点,而且很复杂,但是请注意
()
中的
()
实际上是强制性的(
->x{x}.1#=>error
),并且与普通方法调用中的
()
不同,后者是可选的。因此,在某种意义上,你可以说
()
本身就是方法名,但它也可以作为围绕参数的
()
,就像方法
[]
一样。好的一点,还要注意
->x,y{x+y}((4,5))#=>错误
基本上是说,如果外部参数是“方法名称”,那么这个特定的“方法”不允许像所有其他“方法”一样使用内部参数……是的,我同意,复杂:)。
"Hello".index "e"