重複の可能性:
class << self idiom in Ruby
このコードは何をしているのだろうと思っていました。私はこの一行を過小評価していません。私は何attr_accessor
であるかを知っています。
class User
class << self; attr_accessor :base_uri end
....
....
...
重複の可能性:
class << self idiom in Ruby
このコードは何をしているのだろうと思っていました。私はこの一行を過小評価していません。私は何attr_accessor
であるかを知っています。
class User
class << self; attr_accessor :base_uri end
....
....
...
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
これにより、クラス コンテキストでインスタンス変数を定義できます。
コードを参照してください:
class User
class << self; attr_accessor :base_uri end
@base_uri = "aaa";
end
p User.base_uri # will output "aaa"