我正在研究一些不属于我自己的ERB模板,我发现开发人员已经使用了很多这样的语句:
<%= p("object.property.foo") %>
其中 object 是 OpenStruct 。此方法调用会导致打印object.property.foo
的值(如在JavaScript中,或者我知道的大多数语言)。这很棒,因为它比写作简单得多:
<%= object["property"]["foo"] %>
我的问题是:
p
而不是对象本身?p
在这种情况下更可取? (我知道p
与puts
,但为什么在这里使用p
?)答案 0 :(得分:1)
<%= %>
告诉ERB解析器将内容评估为ruby表达式,并在生成的HTML文本中包含返回值。p( )
可能是一个创建一些HTML标记的视图助手函数。这在代码片段中并不明显。显然它再次评估字符串参数作为另一个ruby表达式。 p
不是标准的rails或ruby方法。object
是一个OpenStruct。 OpenStruct
是一种数据结构,它将Hash的行为与类方法的语法相结合。这里记录了:http://ruby-doc.org/stdlib-2.1.0/libdoc/ostruct/rdoc/OpenStruct.html object.property
要求OpenStruct在property
上应用object
。 OpenStruct使用存储值进行回复,例如@value[property]
,其中@value
将是哈希。您不需要方括号语法,因为OpenStruct提供动态访问方法。 '。'是将方法应用于对象的ruby运算符。 OpenStruct的数据存储的内部实现根本不是哈希。根据提问者,返回值是OpenStruct的另一个实例。object.property.foo
调用从foo
返回的OpenStruct实例上的方法object.property
。现在我们收到一个嵌套的OpenStruct对象结构的值。答案 1 :(得分:0)
在我看来,开发人员可能会在代码前面的eval
使p
语句别名。
require 'ostruct'
o = OpenStruct.new(key: 5)
o.key # returns 5
alias p eval
p("o.key") # returns 5
eval
只是一个函数,它执行作为ruby代码传递给它的任何字符串。
关于你的问题
为什么在这种情况下p更受欢迎? (我知道p vs. puts,但为什么在这里使用p?)
我不相信你在这里使用经典的p
功能。默认情况下p
没有&#34; eval&#34;传入它的字符串。 p
函数必须已被eval
函数覆盖。检查代码库中的alias p eval
或alias_method :p, :eval