如何使用self
上两节课?例如,我有以下代码:
class Project < ActiveRecord::Base
class Current
self.state = true
end
end
我需要self.state
来指代项目的州,而不是当前的州。如何使用self
来引用Project
?
更新:经过多次评论后,我正在重新编写代码以使问题更容易:
我需要在Current类中引用Project的当前实例。根据我的理解,上面的代码是不正确的,这应该是如何做到的:
class Project < ActiveRecord::Base
class Current
change_state
end
def change_state
self.state = true
end
end
但是,当我使用此代码时,我收到错误:
undefined local variable or method `change_state' for #<current:0x007fd13953ee60>
我的问题基本相同,我如何在Current中引用Project的当前实例?
答案 0 :(得分:1)
听起来你正在把一个班级放在另一个班级里面这样:
class Alice < ActiveRecord::Base
class Bob
end
end
执行此操作时,Bob不是Alice 或 ActiveRecord :: Base的子类。 Bob只是Object的子类。 Alice和Bob之间的唯一关系是你通过编写Alice :: Bob来访问Bob。要使Bob成为Alice的子类,您必须像这样定义它:
class Bob < Alice
end
如果你这样做,Bob将继承Alice的方法。如果你愿意,你仍然可以把它放在Alice的命名空间里,但重要的是你使用class Bob < Alice
所以Ruby知道你希望Bob成为Alice的子类,而不仅仅是在她的命名空间中挂出一个不相关的类。
答案 1 :(得分:0)
您的代码格式不正确。当你第一次执行外部class
的主体作为定义该类的一部分时,你得到的错误来自Ruby解释器,作为其中的一部分,执行内部类的主体作为定义的一部分< em>那个类。此时未定义change_state
,因此类定义失败。
这是一个简单的例子:
class Foo
puts 1
class Bar
baz
end
puts 2
end
如果您在irb中执行此操作,则会看到1
已打印出来,然后您会收到有关baz
未定义的错误消息。此时尚未调用Foo
和Bar
。这些类正在被定义,因此它们无法实例化。