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

时间:2014-07-18 00:09:15

标签: ruby-on-rails ruby syntax jbuilder

我注意到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

2 个答案:

答案 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} }。