0

8 つの文字列を整数型とマイナス 1 に変更したいのですが、次のようにコードを書きました。

foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1, ...

でも複雑すぎると思います。この目標を達成するためのより良い方法はありますか?

4

5 に答える 5

2
[:foo1, :foo2, ... etc. ...].each { |foo| eval "#{foo} = #{foo}.to_i - 1" }

あなたがそれをすることに決めたなら、それは悪い考えですが。

于 2012-09-21T18:00:38.100 に答える
0

それらを配列に入れるのが最も簡単なことです。

%w{ 1 2 3 4 5 6 7 8 }.map!(&:to_i).map!(&:pred)
=> [0, 1, 2, 3, 4, 5, 6, 7]  
于 2012-09-22T07:21:13.267 に答える
0

@Winfields ソリューションへのコメントに基づいて、これで十分かもしれません。

foo1 = "123"
foo2 = "222"
too3 = "0"
def one_less_int(*args) # the splat sign (#) puts all arguments in an array
 args.map{|str| str.to_i-1}
end
p one_less_int(foo1, foo2, too3) #=> [122, 221, -1]

しかし、他の人が示唆しているように、すべてを事前に配列に入れることは、より明示的です。

于 2012-09-21T23:37:05.957 に答える
0

8 つの変数を操作していて、それらに対して同じ操作を行う必要がある場合、通常はそれらが何らかの方法でリンクされており、たとえばハッシュでグループ化できることを意味します。

data = {:foo1 => "1", :foo2 => "2", ...}
data2 = Hash[data.map { |key, value| [key, value.to_i - 1] }]

インプレース値を更新する代わりに、新しいオブジェクトを作成することに注意してください。通常、機能的なアプローチはより明確です。

于 2012-09-21T19:24:24.860 に答える
0

これは使用しないでください。eval は危険で動的です。キーを制御できるハッシュに値を移動することをお勧めします。あなたが尋ねたことを文字通りやりたいなら:

(1..2).map {|n | eval("foo#{n}").to_i - 1}

例:

> foo1 = 2
=> 2
> foo2 = 3
=> 3
> (1..2).map {|n | eval("foo#{n}").to_i - 1}
=> [1, 2]

...これらの値を保存/処理する恐ろしくない方法:

> hash = { :foo1 => 2, :foo2 => 3 }
=> {:foo1=>2, :foo2=>3}
hash.keys.inject({}) { |h, key| h[key] = hash[key].to_i - 1; h }
=> {:foo1=>1, :foo2=>2}
于 2012-09-21T17:55:55.860 に答える