Ruby setter方法语法方法=(值) - 与Java的比较

时间:2014-06-02 22:57:00

标签: java ruby methods setter

您好亲爱的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

提前感谢您的关注。

亚历

3 个答案:

答案 0 :(得分:2)

Ruby中最惯用的方法是

def name=(value)
  @name = value
end

或更好,

attr_writer :name

答案 1 :(得分:2)

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

o.p = v

你真的在说:

o.send(:p=, v)

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

's'.pancakes = 11

为您提供了一个NoMethodError例外,抱怨's'没有使用pancakes=方法:字符串不会(不幸的是)有pancakes=种方法。

在您的情况下,您根本不会使用set_name,而是拥有name=方法:

def name=(value)
  @name = value
end

并且可能是name方法作为访问者/获取者:

def name
  @name
end

答案 2 :(得分:1)

  

我需要使用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)