【问题标题】:Ruby setter method syntax method=(value) - Comparison to JavaRuby setter 方法语法 method=(value) - 与 Java 的比较
【发布时间】:2014-06-02 22:56:59
【问题描述】:

你好亲爱的stackoverflowers :)

我来自 Java,对 getter 的语法有一个疑问(如果它真的只是一个语法问题)。

在java中你会有一个像

这样的setter
private void setName(value) {
    variableName = value;
}

谁会将值作为参数并更改其中的实例变量。

在 ruby​​ 中,当我显式定义一个 setter 时(由于约束原因),我需要使用 set_name=(value) 或者如果我使用语法 set_name(value) 会是一样的吗?换句话说,方法名称末尾的 = 可以做任何其他事情,或者它只是语法(比如 ! 和 ?)。

像这样:

def set_name=(value)
    @name = value
end

或者这个:

def set_name(value)
    @name = value
end

提前感谢您的关注。

亚历克斯

【问题讨论】:

  • 这似乎是一个相当基本的问题 - 您是否使用任何书籍或网站来学习 Ruby?
  • 是的,我正在使用teamtreehouse,并且还在网上查看这些概念。但是这个几乎搜索了所有网络后,我仍然不清楚。

标签: java ruby methods setter


【解决方案1】:

方法名称中的结尾= 将该方法标识为setter/mutator 方法。当你在 Ruby 中这样说时:

o.p = v

你真的是在说:

o.send(:p=, v)

所以o.p = v 只是在o 中调用p= 方法的一种奇特方式。这就是为什么这样的事情:

's'.pancakes = 11

给你一个NoMethodError 异常,抱怨's' 没有pancakes= 方法:字符串没有(很遗憾)有pancakes= 方法。

在你的情况下,你根本不会使用 set_name,你会有一个 name= 方法:

def name=(value)
  @name = value
end

可能还有一个name 方法作为访问器/获取器:

def name
  @name
end

【讨论】:

    【解决方案2】:

    Ruby 中最惯用的方法是做

    def name=(value)
      @name = value
    end
    

    或者更好,

    attr_writer :name
    

    【讨论】:

      【解决方案3】:

      我需要使用 set_name=(value) 或者如果我使用语法 set_name(value) 会一样吗?

      class Dog
        attr_reader :name
      
        def initialize(name)
          @name = name
        end
      
        def name1=(str)
          @name = str
        end
      
        def name2(str)
          @name = str
        end
      end
      
      d = Dog.new("Rover")
      puts d.name  #=>Rover
      d.name1 = "Ruthie"
      puts d.name  #=>Ruthie
      d.name2("John")
      puts d.name  #=>John
      d.name2 = "Roger"
      
      --output:--
      1.rb:23:in `<main>': undefined method `name2=' for #<Dog:0x00000100907030 @name="John"> (NoMethodError)
      

      对于 setter,方法的名称包括“=”符号。但是 ruby​​ 还允许您使用以 '=' 结尾的方法名称的语法糖:

      obj.setter_name = value
      

      相当于:

      obj.setter_name=(value)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        • 2015-07-23
        • 2018-12-31
        • 2012-03-30
        • 2011-06-13
        • 2021-09-03
        • 1970-01-01
        相关资源
        最近更新 更多