1

私は Ruby プログラミングは初めてで、インスタンス変数がその前に「@」記号なしで呼び出されている例をいくつか見てきました。

メソッドが呼び出され、クラス内の結果としてインスタンス変数がメソッドに格納されているattr_readerためか、インスタンス変数の理解が間違っているためかどうかはわかりません。

Russ Olsen の Eloquent Ruby から引用した例を次に示します。ここでは、@unique配列のsize前に「@」記号を付けずにメソッドが呼び出されています。

class TextCompressor
attr_reader :unique, :index

def initialize(text)
    @unique = []
    @index = []
    add_text(text)
end

def add_text(text)
    words = text.split
    words.each { |word| add_word(word) }
end

def add_word(word)
    i = unique_index_of(word) || add_unique_word(word)
    @index << i
end

def unique_index_of(word)
    @unique.index(word)
end

def add_unique_word(word)
    @unique << word
    unique.size - 1
end
end
4

4 に答える 4

3

私はRubyも初めてで、数週間学んでいます。私は信じている:

attr_reader :unique

メソッドの定義と機能的には同じです。

def unique
  @unique
end
于 2013-08-29T04:04:23.830 に答える
1

インスタンス変数を「呼び出す」のではなく、メソッドを呼び出します。「@」なしで実際のメソッド呼び出しを行うというあなたの仮定は正しいです。はattr_accessor :unique, :index基本的に次と同等です。

def unique
  @unique
end

def unique=(val)
  @unique = val
end

def index
  @index
end

def index=(val)
  @index = val
end

unique = valメソッド定義時に書けるのunique=(val)はRubyが提供するシンタックスシュガーで、実際はメソッド呼び出しなのに変数代入に見せかけます。

ただし、一般に、インスタンス変数を参照するさまざまな方法を 1 つのメソッドに混在させるべきではありません。メソッドが値の格納方法の実装の詳細を知る必要がある場合は、 で直接アクセスを使用できます@。それ以外の場合は、アクセサー メソッドを使用する必要があります。実装の詳細に依存するコードが少ないほど、優れています。それぞれのインスタンスのインスタンスメソッド内であっても。

于 2013-08-29T04:14:56.247 に答える
0

この線 :

attr_reader :unique, :index

次のような一意のインデックスの getter メソッドを作成します。

def unique
 @unique
end

だからあなたが呼び出すとき:

unique.size

最初に @unique を返す getter メソッドを呼び出し、次に size メソッドを呼び出します。

于 2013-08-29T04:04:06.670 に答える