请解释我为什么要在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
答案 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_reader
和attr_writer