【问题标题】:Ruby. Symbol '=' in to the setter name and initialization of an object红宝石。设置器名称和对象初始化中的符号“=”
【发布时间】:2012-07-09 03:24:25
【问题描述】:
class Item

    def name=(name_value)   
        @name = name_value
    end

    def name
        @name
    end

end

第一种情况:

item = Item.new
item.name=("value")
puts item.class

我不断得到。

Item

第二种情况:

item = Item.new.name=("value")
puts item.class

我有

String

为什么?我不明白其中的区别。

【问题讨论】:

    标签: ruby object setter initializer


    【解决方案1】:

    Ruby 认为您的第二个示例是这样的

    item = Item.new.name = 'value'
    

    赋值运算符的返回值是被赋值的值。 Item.new.name = 'value' 返回 'value'item = 'value' 也是如此。

    class Item
      def name=(name_value)
        @name = "processed #{name_value}"
      end
    
      def name
        @name
      end
    end
    
    item = Item.new
    item2 = item.name = "value" # your example code
    
    item2 # => "value"
    item.name # => "processed value"
    

    【讨论】:

      【解决方案2】:

      在 Ruby 中,赋值表达式计算为被赋值的值。

      即:

      foo = 'bar'
      

      评估为'bar'

      所以,在你的情况下

      Item.new.name=("value")
      

      这样写更习惯:

      Item.new.name = 'value'
      

      分配的值是字符串'value'

      所以,Item.new.name = 'value' 的计算结果为 'value'(当然还有调用 name= 方法的副作用),这意味着

      item = Item.new.name = 'value'
      

      计算为

      item = 'value'
      

      最后,item 的值为'value',即String

      【讨论】:

      • 我们的答案就像双胞胎:)
      【解决方案3】:

      在第二种情况下,您正在创建一个新项目并设置名称,当您设置名称时,它会返回一个字符串,您将其分配给项目变量。 你应该使用第一种形式

      或者从 ActiveRecord 继承时:

      item = Item.new(:name=>"value")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多