【发布时间】:2016-12-05 00:42:13
【问题描述】:
这是我尝试设置实例变量的模块。我正在尝试初始化和 self.included,但是当我在最外层 (main) 范围内执行包含时,两者都不起作用:
module Asd
def initialize
@asd = 0
end
def self.included(base)
@asd = 0
end
attr_reader :asd
end
将它包含在一个类中是可行的,我可以读取实例变量:
class Bsd
include Asd
end
Bsd.new.asd
# => 0
但是在全球范围内这样做是行不通的:
include Asd
@asd
# => nil
asd
# => nil
我知道人们经常会质疑将代码置于全球层面的动机。在这种情况下,我只想看看它是如何完成的。
【问题讨论】:
-
我相信
initialize仅在您创建实例时运行。Asd是一个模块,你不能有一个模块的实例。然后,当您像以前那样在全局级别包含Asd时,您将不会运行initialize。 -
至于
asd方法...我真的不知道你为什么会得到NoMethodError。 -
我正在运行
ruby 2.3.0p0,并调用include Asd,然后asd给我nil,而不是NoMethodError。您可以使用Pry REPL 下的ls -pv命令查看方法是否已定义。 -
self.included方法内部的@asd与initialize内部的不一样。不同的上下文。 -
EddeAlmeida & tewu 你是对的;我的错;已编辑问题
标签: ruby