我想知道这段代码在做什么。我并不低估这一行。我知道attr_accessor
是什么。
class User
class << self; attr_accessor :base_uri end
....
....
...
答案 0 :(得分:5)
您会在Ruby中看到class << self
经常使用。理解它的作用的最简单方法是将其视为(几乎)等同于此:
class Abc
self.attr_accessor ...
end
这与此基本相同:
Abc.class.attr_accessor ...
但你真的不能做到这两点,因为:
> Abc.class.attr_accessor :blah
NoMethodError: private method `attr_accessor' called for Class:Class
所以要解决它你必须做的事情:
> Abc.class.send(:attr_accessor, :blah)
或者:
class Abc
self.send(:attr_accessor, :blah)
end
这就是<< self
构造的用武之地,因为它允许您访问这些私有方法。您基本上是在“自我空间”中直接操作。
同样当你看到:
class Abc
class << self
def foo
end
end
end
这跟说:
class Abc
def self.foo
end
end
这将定义一个类方法,就像你问题中的代码将定义一个类级别的attr_accessor。
修改强>
至于一种不太复杂的方式 - Ruby默认情况下没有一个能够创建类级别attr_accessors的方法。这就是你必须使用<< self
技巧的原因。
但是Rails确实定义了一种类似的方法,而不必使用<< self
。在Rails中,您有cattr_accessor
:
class Abc
cattr_accessor :blah
end
Abc.blah = 123
Abc.blah
>> 123
答案 1 :(得分:1)
这允许在类上下文中定义一个实例变量。
参见代码:
class User
class << self; attr_accessor :base_uri end
@base_uri = "aaa";
end
p User.base_uri # will output "aaa"