Ruby-如何使用“自”方法从类中访问实例变量?

问题描述 投票:0回答:2

抱歉,我不知道该如何命名,我很难查找此内容。[[因为我不知道该怎么说。无论如何...

例如,我有一个看起来像这样的类:

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? (很抱歉,如果这个问题是一团糟。)
ruby instance-variables
2个回答
1
投票
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编程的教程或基础级书籍,找到有关对象和类的章节。做一些运动。 

0
投票
在Ruby中,实例变量只是范围为类实例的词法变量。由于它们的作用域仅限于实例,因此它们始终像私有变量一样起作用。

如果要从外部提供对实例变量的访问,则可以创建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

© www.soinside.com 2019 - 2024. All rights reserved.