Ruby使用属性数组调用attr方法

时间:2015-02-21 10:17:31

标签: ruby

请解释我为什么要在attr_list之前定义attr?我不明白为什么我应该这样做?

class Question
  def self.attr_list
    [:id, :name]
  end

  attr *self.attr_list
end

class Question
  attr *self.attr_list

  def self.attr_list
    [:id, :name]
  end
end
NoMethodError: undefined method `attr_list' for Question:Class

1 个答案:

答案 0 :(得分:2)

与def不同,在您点击返回以运行程序后,会立即逐行执行类:

class Dog
  x = 10
  puts x
end

--output:--
10

...

class Dog
  puts x
  x=10
end

--output:--
1.rb:2:in `<class:Dog>': undefined local variable or method `x' 
  In this line:

...

class Dog
  def self.greet
    puts 'hello'
  end

  greet
end

--output:--
hello

...

class Dog
  greet

  def self.greet
    puts 'hello'
  end

end

--output:--
1.rb:2:in `<class:Dog>': undefined local variable or method `greet'

同样,在这一行:

attr *self.attr_list

你打电话给self.attr_list(),然后def就在那一行之后,所以这个方法还不存在。

使用def,你可以这样写:

def do_math()
  10/0
end

在调用方法之前,您不会收到错误。

但是当你创建一个类的实例时,类中的所有代码都已经执行,创建了在类中定义的方法和常量。

顺便说一下,您不需要使用attr因为ruby 1.8.7+有attr_accessor(读者和作者),attr_readerattr_writer