3

この単純なメソッドが入力の名前に関連する値を返すようにしようとしています。たとえば、メソッド「people_array」を指定すると、「people_array_of_arrays」が返されます。

IRBでこのメソッドを使用している場合、次のようになります。

people_array = ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
=> ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
make_array_of_arrays(people_array)
=> people_array_of_arrays
people_array
=> ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
people_array_of_arrays
=> [["George", "Micahel"], ["Kim", "Kardashian"], ["Kayne", "West"]]

私はこれまでこれを書いてきましたが、うまく名前が付けられた配列の配列を返す方法を理解することができませんでした。私が考えることができたのは文字列補間だけでしたが、それは私が必要としているものではありません。

def make_array_of_arrays(array)
    formatted_array = []
    array.each do |feed|
        mini_array = feed.split("\t")
        formatted_array.push(mini_array)
    end
    #{array}_of_arrays = formatted_array
end

variablizeメソッドがあるのを見ましたが、それは私が望むものとは正確に異なるインスタンス変数を返します。ポインタはありますか?

4

4 に答える 4

3

簡単にできるとは思いません。メソッド定義内で何らかの方法でローカル変数を定義できたとします。ただし、そのローカル変数の範囲はメソッド定義に限定されます。したがって、メソッド定義の外に出ると、ローカル変数名はなくなります。したがって、それを行うにbindingは、メソッド定義の外部で環境の情報を取得し、その中でローカル変数を定義する必要があります。それが可能かどうかはわかりません。

インスタンス変数を使用すると、を使用すると少し簡単になりますが、instance_variable_set完全に実装する方法がわかりません。まず、元の変数の名前を取得するのは難しいです。

そして、あなたがやろうとしていることは正しいアプローチではありません。さまざまな方法を考える必要があります。


ローカル変数の代わりにインスタンス変数を使用し、配列自体の代わりに変数の名前を明示的に指定するのが最善の方法だと思います。

def make_array_of_arrays(variable_name)
  array = instance_variable_get("@#{variable_name}")
  # Your code here
  instance_variable_set("@#{variable_name}_of_arrays", formatted_array)
end

@people_array = ["George\tMichael", "Kim\tKardashian", "Kanyne\tWest"]
make_array_of_arrays(:people_array)
@people_array_of_arrays
#=> [["George", "Micahel"], ["Kim", "Kardashian"], ["Kayne", "West"]]


これも役立つかもしれません。

于 2012-10-26T21:37:05.077 に答える
2

メタプログラミングの必要はありません(私があなたの質問を誤解しない限り)。フォーマットされた配列を返すだけです。

def make_array_of_arrays(array)
    formatted_array = []
    array.each do |feed|
        mini_array = feed.split("\t")
        formatted_array.push(mini_array)
    end
   formatted_array
end

次に、任意の名前に戻り値を割り当てることができます。

people_array_of_arrays = make_array_of_arrays(people_array)

、メソッドmapを簡略化するために使用できます。make_array_of_arrays

def make_array_of_arrays(array)
    array.map do |feed|
        feed.split("\t")
    end
end
于 2012-10-26T21:16:07.190 に答える
2

ここでの大きな問題は、変数の名前にアクセスする良い方法がないことです。

それを除けば、Sean Vieiraの追加に基づいて、これを取得するためにいくつかの評価魔法を行うことができます。

def make_array_of_arrays(array, array_name)
    new_array = array.map { |feed| feed.split("\t") }

    eval("def #{array_name}_of_arrays; return #{new_array}; end")
end

これは基本的に、探している配列を返す*_of_arrays行の関数を作成します。

変数の名前を取得する方法を見つけることができれば、必要なものはすべて揃っています。私がこの方法を本当に公式に支持しているわけではありません。そして、私はあなたがこれをしたい理由を私の一生の間理解することができません。それは非常に単調であり、そのコードのチャンクを見ている人にとっては混乱を招くでしょう。

于 2012-10-26T21:58:43.373 に答える
0

これは簡単でもお勧めでもありません。

Rubyオブジェクトは、電話で通信する人(あなたと私)と考えてください(電話番号はobject_idです)。私があなたの電話番号のリストに(変数)「sTeEnSlAg」という名前で、また「steenslg」の下にいると想像してみてください。次に、私に電話して、「私の電話に登録されている名前を、「_of_arrays」で後置してください。

私の答えの丁寧なバージョンは何だと思いますか?

于 2012-10-26T22:05:26.590 に答える