質問

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

場合の方法だけである 光機能 これらの任意のインスタンス変数)は、このメソッドをモジュールと includeextend のクラスでのご利用とプライベートクラスの方法や民間インスタンス方法。

今日ではなく、ヘルパーの方法です。できるだけでインラインになっている資料が置かれてい法定義で設定します。この感じもお馴染みの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のクラス名---

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top