Ruby 为什么要将点(.)分隔字符串传递给;p";?

Ruby 为什么要将点(.)分隔字符串传递给;p";?,ruby,Ruby,我正在开发一些不是我自己的ERB模板,我看到开发人员经常使用这样的语句: 其中,对象是OpenStruct。此方法调用导致打印object.property.foo的值(如JavaScript或我所知的大多数语言)。这非常棒,因为它比写作简单得多: 我的问题是: 为什么我可以使用“.”符号访问属性 为什么我要将字符串传递给p,而不是对象本身 在这种情况下,p为什么更可取?(我知道p与put,但为什么在这里使用p) 告诉ERB解析器将内容作为ruby表达式进行计算,并在生成的HTML文本中

我正在开发一些不是我自己的ERB模板,我看到开发人员经常使用这样的语句:

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

我的问题是:

  • 为什么我可以使用“.”符号访问属性
  • 为什么我要将字符串传递给
    p
    ,而不是对象本身
  • 在这种情况下,
    p
    为什么更可取?(我知道
    p
    put
    ,但为什么在这里使用
    p
      • 告诉ERB解析器将内容作为ruby表达式进行计算,并在生成的HTML文本中包含返回值
      • p()
        可能是一个创建一些HTML标记的视图辅助函数。这在代码片段中并不明显。显然,它对字符串参数求值,同样作为另一个ruby表达式
        p
        不是标准的rails或ruby方法
      • 根据提问者的说法,
        对象是一个OpenStruct
        OpenStruct
        是一种数据结构,它将哈希的行为与类方法的语法结合起来。这里有记录:
      • object.property
        要求OpenStruct在
        object
        上应用
        property
        。OpenStruct使用一个存储值进行响应,类似于
        @value[property]
        ,其中
        @value
        将是一个散列。您不需要方括号语法,因为OpenStruct提供了动态访问方法。“.”是将方法应用于对象的ruby运算符。OpenStruct数据存储的内部实现根本不必是散列。根据提问者的说法,返回值是OpenStruct的另一个实例
      • object.property.foo
        对从
        object.property
        返回的OpenStruct实例调用方法
        foo
        。现在我们接收嵌套OpenStruct对象结构的值

      在我看来,开发人员可能在代码的前面某处将
      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语句是否为默认值。