があるので、呼び民間のクラスメソッドからのインスタンスルビー?
-
09-06-2019 - |
質問
以 self.class.send :method, args...
, します。お客様はかなり複雑な方法の両方でクラスのインスタンスレベル重複することなく、コードです。
更新:
@ジョナサン-Branam:そんな想定のものを作りたいと思ったい何を見つけたからとなります。■■視認性のルビーは非常に異なることからJava.まもなかなか利用できるよう、 private
なクラスメソッドがこのことを宣言するプライベートクラスの方法
class Foo
class <<self
private
def bar
puts 'bar'
end
end
end
Foo.bar
# => NoMethodError: private method 'bar' called for Foo:Class
解決
こちらはコードスニペットを持っています。を非表示になり、プライベートクラス定義の適用がなくクラス。を使用する必要があり"private_class_method"として、以下の例です。
class Foo
def self.private_bar
# Complex logic goes here
puts "hi"
end
private_class_method :private_bar
class <<self
private
def another_private_bar
puts "bar"
end
end
public
def instance_bar
self.class.private_bar
end
def instance_bar2
self.class.another_private_bar
end
end
f=Foo.new
f=instance_bar # NoMethodError: private method `private_bar' called for Foo:Class
f=instance_bar2 # NoMethodError: private method `another_private_bar' called for Foo:Class
と思いますかをわかりやすく伝えるための頃。の文書によるとを指定することはできませんの受取の方法です。もできるだけアクセス、個人から同一のインスタンスとなります。のクラスFooは異なるオブジェクトにより指定のインスタンスFoo.
僕の回答としての最終的なものとする。私は確かなものにしたかったのをコードスニペットその人なりの答えて適切なプライベートクラス。
他のヒント
私の貢献をこのリストは不思議なソリューションや非ソリューション
puts RUBY_VERSION # => 2.1.2
class C
class << self
private def foo
'Je suis foo'
end
end
private define_method :foo, &method(:foo)
def bar
foo
end
end
puts C.new.bar # => Je suis foo
puts C.new.foo # => NoMethodError
場合の方法だけである 光機能 これらの任意のインスタンス変数)は、このメソッドをモジュールと include
や extend
のクラスでのご利用とプライベートクラスの方法や民間インスタンス方法。
今日ではなく、ヘルパーの方法です。できるだけでインラインになっている資料が置かれてい法定義で設定します。この感じもお馴染みのJavaん
class MyClass
private_class_method def self.my_private_method
puts "private class method"
end
private def my_private_method
puts "private instance method"
end
end
とご指定いただくことはできません電話民間のクラスメソッドからのインスタンス方法。しかし、代わりに実行し、 民間 クラスメソッドとして 公開 クラスメソッドは、 民間 入れ子のクラスではなく、 private_constant
ヘルパーな方法です。見 このblogpost 詳します。
こ遊び"リアル"プライベートクラス。
class Foo
def self.private_bar
# Complex logic goes here
puts "hi"
end
private_class_method :private_bar
class <<self
private
def another_private_bar
puts "bar"
end
end
public
def instance_bar
self.class.private_bar
end
def instance_bar2
self.class.another_private_bar
end
def calling_private_method
Foo.send :another_private_bar
self.class.send :private_bar
end
end
f=Foo.new
f.send :calling_private_method
# "bar"
# "hi"
Foo.send :another_private_bar
# "bar"
乾杯
この"ネイティブバニラのRubyスクリプトで行うには:
class Foo
module PrivateStatic # like Java
private def foo
'foo'
end
end
extend PrivateStatic
include PrivateStatic
def self.static_public_call
"static public #{foo}"
end
def public_call
"instance public #{foo}"
end
end
Foo.static_public_call # 'static public foo'
Foo.new.public_call # 'instance public foo'
Foo.foo # NoMethodError: private method `foo' called for Foo:Class
Foo.new.foo # NoMethodError: private method `foo' called for #<Foo:0x00007fa154d13f10>
一部のRuby metaprogrammingきもの見えないように:
class Foo
def self.foo
'foo'
end
extend PrivateStatic
private_static :foo
end
Rubyのmetaprogrammingは非常に強力なのですが技術的に実施いスコーピング規定しておくと良いかもしれません。とはいえ、私は、未だに明 最小限の驚き 最初のバリアントだ。
なんの違いだけのようなこと:
class Foo
private
def Foo.bar
# Complex logic goes here
puts "hi"
end
public
def bar
Foo.bar
end
end
もちろん変えることができる第二の定義に使用します。クラスです。送信アプローチしたい場合は、回避hardcodingのクラス名---