抱歉,我不知道该如何命名,我很难查找此内容。[[因为我不知道该怎么说。无论如何...
例如,我有一个看起来像这样的类:class Run
def self.starting
print "starting..."
end
def self.finished
print "Finished!"
end
end
Run
中的所有方法前面都带有self
,这意味着我不必执行run = Run.new
,而我可以执行Run.starting
。现在让我们说我想添加一些实例变量...
class Run attr_accessor :starting, :finished def self.starting print "starting..." @starting = true @finished = false end def self.finished print "finished!" @starting = false @finished = true end end
如果我想从类外部访问那些实例变量,该怎么办?我知道print "#{Run.finished}"
或print "#{Run.starting}"
之类的东西什么也不会做。没有run = Run.new
,我可以这样做吗?还是我应该先删除self
,然后再使用run = Run.new
? (很抱歉,如果这个问题是一团糟。)
Run中的所有方法都在它们前面,这意味着我不必执行run = Run.new,而我可以执行Run.starting
还有比这更多的东西。在您的情况下,您正在调用类方法。如果您执行了runner = Runner.new
-那么您将调用实例方法(定义的这些方法没有self
。
通常,如果您需要“事物”来保持某种状态(例如@running = true
),则您希望实例化一个对象并调用这些方法。
现在,@whatever
是实例变量,并且您无法在类方法中访问它们。
class Run
attr_reader :running
def start
@running = true
end
def stop
@running = false
end
end
runner = Run.new
runner.running # nil
runner.start
runner.running # true
runner.stop
runner.running # false
我建议您编写一些有关Rails编程的教程或基础级书籍,找到有关对象和类的章节。做一些运动。
如果要从外部提供对实例变量的访问,则可以创建setter和getter方法。那就是attr_accessor
所做的。
class Person
attr_accessor :name
def initialize(name:)
@name = name
end
def hello
"Hello my name is #{@name}"
end
end
john = Person.new(name: 'John')
john.name = "John Smith"
puts john.hello # "Hello my name is John Smith"
puts john.name # "John Smith"
def self.
定义的方法是类方法,也称为单例方法。您不能从类方法内部访问属于实例的变量,因为调用该方法的接收者是该类本身,而不是该类的实例。Ruby还具有类变量,这些变量由一个类及其子类共享:
class Person @@count = 0 def initialize self.class.count += 1 end def self.count @@count end def self.count=(value) @@count = value end end class Student < Person end Person.new Student.new puts Person.count # 2 - wtf!
以及不与子类共享的类实例变量:
class Person @count = 0 def initialize self.class.count += 1 end def self.count @count end def self.count=(value) @count = value end end class Student < Person end Person.new Student.new puts Person.count # 1