Ruby 为什么要将点(.)分隔字符串传递给;p";?
我正在开发一些不是我自己的ERB模板,我看到开发人员经常使用这样的语句:Ruby 为什么要将点(.)分隔字符串传递给;p";?,ruby,Ruby,我正在开发一些不是我自己的ERB模板,我看到开发人员经常使用这样的语句: 其中,对象是OpenStruct。此方法调用导致打印object.property.foo的值(如JavaScript或我所知的大多数语言)。这非常棒,因为它比写作简单得多: 我的问题是: 为什么我可以使用“.”符号访问属性 为什么我要将字符串传递给p,而不是对象本身 在这种情况下,p为什么更可取?(我知道p与put,但为什么在这里使用p) 告诉ERB解析器将内容作为ruby表达式进行计算,并在生成的HTML文本中
其中,对象是OpenStruct。此方法调用导致打印object.property.foo
的值(如JavaScript或我所知的大多数语言)。这非常棒,因为它比写作简单得多:
我的问题是:
- 为什么我可以使用“.”符号访问属性
- 为什么我要将字符串传递给
,而不是对象本身p
- 在这种情况下,
为什么更可取?(我知道p
与p
,但为什么在这里使用put
)p
告诉ERB解析器将内容作为ruby表达式进行计算,并在生成的HTML文本中包含返回值
可能是一个创建一些HTML标记的视图辅助函数。这在代码片段中并不明显。显然,它对字符串参数求值,同样作为另一个ruby表达式p()
不是标准的rails或ruby方法p
- 根据提问者的说法,
对象是一个OpenStruct
是一种数据结构,它将哈希的行为与类方法的语法结合起来。这里有记录:OpenStruct
要求OpenStruct在object.property
上应用object
。OpenStruct使用一个存储值进行响应,类似于property
,其中@value[property]
将是一个散列。您不需要方括号语法,因为OpenStruct提供了动态访问方法。“.”是将方法应用于对象的ruby运算符。OpenStruct数据存储的内部实现根本不必是散列。根据提问者的说法,返回值是OpenStruct的另一个实例@value
对从object.property.foo
返回的OpenStruct实例调用方法object.property
。现在我们接收嵌套OpenStruct对象结构的值foo
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与put,但为什么在这里使用p?)
我不相信您在这里使用的是经典的
p
函数。默认情况下,p
不会“eval”传递给它的字符串。p
功能必须已被eval
功能覆盖。检查代码库中是否有类似于alias p eval
或alias\u method:p,:eval
的内容,这几乎就是OpenStruct的全部要点。哎呀,我被误导了!哈哈,如果你想回答这个问题,我就接受了。但是,我也很好奇为什么我要将字符串传递给p
,而不是对象引用本身?你能解释一下为什么这很重要吗?它如何回答我的问题?也许是一个例子。@Breedly还有两个悬而未决的问题:(a)p做什么,以及(b)您能否确认object
和object.property
是否都是OpenStruct的实例?你能用pry
检查吗?两者都是开放式结构。@Breedly你能在pry中的位置检查显示方法p
,或者用
替换
,看看你在浏览器中得到了什么吗?这将是一个毫无意义的别名,因为ERB解析器正在评估ruby语句是否为默认值。