语法错误,意外'=',期待keyword_end

时间:2013-08-10 14:08:12

标签: ruby

我有这段代码:

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。

我对红宝石很新,所以如果我做错了就告诉我。

2 个答案:

答案 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创建gettername。您将不得不在其周围编写额外的锅炉板代码。该课程看起来像:

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 :namename创建实例方法。 attr_accessorModule类中的一种方法。

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

def initialize(name)
    @name = name
end