为什么将点(。)分隔的字符串传递给“p”?

时间:2016-01-11 15:18:53

标签: ruby

我正在研究一些不属于我自己的ERB模板,我发现开发人员已经使用了很多这样的语句:

<%= p("object.property.foo") %>

其中 object OpenStruct 。此方法调用会导致打印object.property.foo的值(如在JavaScript中,或者我知道的大多数语言)。这很棒,因为它比写作简单得多:

<%= object["property"]["foo"] %>

我的问题是:

  • 为什么我可以使用“。”访问属性。符号?
  • 为什么我将字符串传递给p而不是对象本身?
  • 为什么p在这种情况下更可取? (我知道pputs,但为什么在这里使用p?)

2 个答案:

答案 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 evalalias_method :p, :eval