我来自Java,现在我正在使用Ruby.
我不熟悉的一个语言功能是module
.我想知道究竟是module
什么,你什么时候使用一个,为什么要用module
一个class
?
什么是Ruby变量,在符号(@@
)前面加上double ?我对一个带有at符号的变量的理解是它是一个实例变量,在PHP中是这样的:
PHP版本
class Person {
public $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
Run Code Online (Sandbox Code Playgroud)
Ruby相当于
class Person
def set_name(name)
@name = name
end
def get_name()
@name
end
end
Run Code Online (Sandbox Code Playgroud)
双重标志@@
是什么意思,它与单个标志有什么不同?
我有一些模块,我想在其中使用实例变量.我目前正在初始化它们:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
Run Code Online (Sandbox Code Playgroud)
我也可以调用init方法来初始化它们:
def init
@var = 0
end
Run Code Online (Sandbox Code Playgroud)
但这意味着我必须记住要经常打电话给它.
有没有更好的方法呢?
假设包含模块而不是扩展模块,模块实例变量和类变量之间有什么区别?
我认为两者之间没有任何区别.
module M
@foo = 1
def self.foo
@foo
end
end
p M.foo
module M
@@foo = 1
def self.foo
@@foo
end
end
p M.foo
Run Code Online (Sandbox Code Playgroud)
我一直在模块中使用@ as @@,我最近看到其他代码在模块中使用@@.然后我以为我可能错误地使用它.
由于我们无法实例化模块,因此模块的@和@@之间必须没有区别.我错了吗?
-----------------------添加以下内容--------------------
为了回答有关评论和帖子的一些问题,我还测试了以下内容.
module M
@foo = 1
def self.bar
:bar
end
def baz
:baz
end
end
class C
include M
end
p [:M_instance_variabies, M.instance_variables] # [@foo]
p [:M_bar, M.bar] # :bar
c = C.new
p c.instance_variables
p [:c_instance_variabies, c.instance_variables] # []
p [:c_baz, c.baz] :baz
p [:c_bar, c.bar] # undefined …
Run Code Online (Sandbox Code Playgroud)