我有这段代码:
class TVShow
attr_accessor :name
attr_accessor :tvdbID
def initialize(showName)
:name = showName
end
end
它给了我这个错误:
syntax error, unexpected '=', expecting keyword_end
:name = showName
我想要做的是拥有一个可以在整个班级中使用的公共变量,所以我正在尝试使用:name和:tvdbID。
我对红宝石很新,所以如果我做错了就告诉我。
答案 0 :(得分:2)
变化:
def initialize(showName)
:name = showName
end
到
def initialize(showName)
@name = showName
end
你也可以这样做:
attr_accessor :name, :tvdbID
一些例子:
class Dog
def initialize(name)
@name = name
end
def show
puts "I am a Dog named: " + @name
end
def add_last_name(last_name)
@name = @name + " " + last_name
end
end
d = Dog.new "Fred"
d.show
d.add_last_name("Rover")
d.show
--output:--
I am a Dog named: Fred
I am a Dog named: Fred Rover
因此,可以从类中自由访问实例变量。但是,您无法从类外部访问上述示例中的实例变量:
d = Dog.new "Fred"
puts d.name
--output:--
1.rb:17:in `<main>': undefined method `name' for #<Dog:0x000001010a5b48 @name="Fred"> (NoMethodError)
以下是如何从类外部访问实例变量:
class Dog
def initialize(name)
@name = name
end
def name #getter
@name
end
def name=(val) #setter
@name = val
end
end
d = Dog.new "Fred"
puts d.name
--output:--
Fred
那些getter和setter很难输入 - 特别是如果你说了10个实例变量 - 所以ruby提供了一个快捷方式:
class Dog
def initialize(name, age)
@name = name
@age = age
end
attr_accessor :name, :age
end
d = Dog.new("Fred", 5)
puts d.name
puts d.age
d.age = 6 #calls age=() method
puts d.age
--output:--
Fred
5
6
但习惯上在一个类的开头编写attr_accessor行。
答案 1 :(得分:0)
Ruby attr_accessor
是定义字段(实例变量)的setter和getter(read mutators)的简写。因此,如果您想为setter
创建getter
和name
。您将不得不在其周围编写额外的锅炉板代码。该课程看起来像:
class TVShow
def name=(name)
@name = name
end
def name
@name
end
#Similarly other instance variables.
#Instance variables always start with @
end
您将使用
实例化该类的对象tvshow = TVShow.new
tvshow.name = 'Stack Overflow'
puts "New tv show : #{tvshow.name}"
:attr_accessor :name
为name
创建实例方法。 attr_accessor
是Module
类中的一种方法。
在Ruby中,不需要在类的开头定义实例变量(就像在Java,C ++等其他语言中那样)。因此,在构造函数中,您必须从符号更改为实例变量
def initialize(name)
@name = name
end