0

我有这个代码:

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 做的事情。

我对红宝石还很陌生,所以如果我做错了,请告诉我。

4

2 回答 2

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 行。

于 2013-08-10T14:10:41.383 回答
0

在 Rubyattr_accessor中是定义字段(实例变量)的 setter 和 getter(读取 mutators)的简写。因此,如果您想创建settergettername. 您将不得不围绕它编写额外的样板代码。该类看起来像:

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为 .创建实例方法nameattr_accessorModule类中的一个方法。

在 Ruby 中,不需要在类的开头定义实例变量(就像在 Java、C++ 等其他语言中所做的那样)。因此,在您的构造函数中,您必须从符号更改为实例变量

def initialize(name)
    @name = name
end
于 2013-08-10T14:44:35.867 回答