23

C スタイルの構文の長い歴史から来て、Ruby (on Rails) を学ぼうとしている私は、そのイディオムなどに問題を抱えていましたが、今日、問題があるとは思っていなかったものにぶつかりました。目の前にあるに違いないものが何なのか見えない。

パス値から URI 値を導出するプライベート メソッドを含む Binary クラスがあります (uri とパスはクラスの属性です)。self.get_uri_from_path()内から呼び出していますBinary.upload()が、次のようになります。

Attempt to call private method

モデルのスニペットは次のようになります。

class Binary < ActiveRecord::Base
  has_one :image

  def upload( uploaded_file, save = false )
    save_as = File.join( self.get_bin_root(), '_tmp', uploaded_file.original_path )

    # write the file to a temporary directory
    # set a few object properties

    self.path   = save_as.sub( Rails.root.to_s + '/', '' )
    self.uri    = self.get_uri_from_path()
  end

  private

  def get_uri_from_path
    return self.path.sub( 'public', '' )
  end
end

間違って電話をかけていますか? さらに基本的な何かが欠けていますか?から呼び出されている唯一の場所Binary.get_uri_from_path()は、現時点ではBinary.upload()です。Ruby が私が使用した他の言語と著しく異なることをしない限り、同じクラス内からプライベート メソッドを呼び出すことができると期待しています。

ありがとう。

4

3 に答える 3

46

しないでください

self.get_uri_from_path()

行う

get_uri_from_path()

なぜなら...

  class AccessPrivate
    def a
    end
    private :a # a is private method

    def accessing_private
      a              # sure! 
      self.a         # nope! private methods cannot be called with an explicit receiver at all, even if that receiver is "self"
      other_object.a # nope, a is private, you can't get it (but if it was protected, you could!)
    end
  end

経由

于 2009-08-19T16:50:38.593 に答える
1

ただし、どのような状況でもプライベートメソッドを呼び出すことができる場所があります。それは次のとおりです。

object.send(:private_method)

1.9 にはこのトリックの別の実装があると思います

于 2009-08-20T03:31:01.490 に答える
1

この場合の適切なイディオムは、self.get_uri_from_path() ではなく、単純に get_uri_from_path() だと思います。自己は冗長です。詳細注: * self.path は、おそらく親クラスで定義されている self の path メソッドを呼び出します。インスタンス変数に直接アクセスしたい場合は、@path. (@ はインスタンス変数の記号です。) * メソッドの引数の括弧は、それらがないとあいまいになる場合を除き、オプションです。必要に応じて、get_uri_from_path() を get_uri_from_path に置き換えることができます。これは、括弧のない関数がその関数のアプリケーションではなく値としてその関数を表す Javascript とは対照的です。

于 2009-08-19T16:53:39.570 に答える