0

重複の可能性:
class << self idiom in Ruby

このコードは何をしているのだろうと思っていました。私はこの一行を過小評価していません。私は何attr_accessorであるかを知っています。

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

2 に答える 2

5

class << selfRubyでよく使われることがわかります。それが何をするのかを理解する最も簡単な方法は、それを(ほぼ)これと同等であると考えることです:

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 に答える