您好亲爱的stackoverflowers:)
我来自Java并且对getter的语法有疑问(如果它只是一个语法问题)。
在java中你会有一个像
这样的setterprivate 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
提前感谢您的关注。
亚历
答案 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)