0

可能重复:
Ruby 中的 class << self idiom

我想知道这段代码在做什么。我没有低估这一行。我知道是什么attr_accessor

class User
  class << self; attr_accessor :base_uri end
  ....
....
...
4

2 回答 2

5

您会看到class << self在 Ruby 中经常使用。理解它的作用的最简单方法是将其视为(几乎)等价于:

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
于 2013-01-31T04:29:30.510 回答
1

这让我们在类上下文中定义一个实例变量。

见代码:

class User
  class << self; attr_accessor :base_uri end
  @base_uri = "aaa";
end

p User.base_uri # will output "aaa"
于 2013-01-31T04:11:49.733 回答