8 つの文字列を整数型とマイナス 1 に変更したいのですが、次のようにコードを書きました。
foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1, ...
でも複雑すぎると思います。この目標を達成するためのより良い方法はありますか?
8 つの文字列を整数型とマイナス 1 に変更したいのですが、次のようにコードを書きました。
foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1, ...
でも複雑すぎると思います。この目標を達成するためのより良い方法はありますか?
[:foo1, :foo2, ... etc. ...].each { |foo| eval "#{foo} = #{foo}.to_i - 1" }
あなたがそれをすることに決めたなら、それは悪い考えですが。
それらを配列に入れるのが最も簡単なことです。
%w{ 1 2 3 4 5 6 7 8 }.map!(&:to_i).map!(&:pred)
=> [0, 1, 2, 3, 4, 5, 6, 7]
@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]
しかし、他の人が示唆しているように、すべてを事前に配列に入れることは、より明示的です。
8 つの変数を操作していて、それらに対して同じ操作を行う必要がある場合、通常はそれらが何らかの方法でリンクされており、たとえばハッシュでグループ化できることを意味します。
data = {:foo1 => "1", :foo2 => "2", ...}
data2 = Hash[data.map { |key, value| [key, value.to_i - 1] }]
インプレース値を更新する代わりに、新しいオブジェクトを作成することに注意してください。通常、機能的なアプローチはより明確です。
これは使用しないでください。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}