我想将8个字符串更改为整数类型并减去1.我将代码编写为:
foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1, ...
但我认为这太复杂了。有没有更好的方法来实现这一目标?
答案 0 :(得分:2)
[:foo1, :foo2, ... etc. ...].each { |foo| eval "#{foo} = #{foo}.to_i - 1" }
虽然你决定这样做是个坏主意。
答案 1 :(得分: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}
答案 2 :(得分:0)
当您使用8个变量并且需要对它们执行相同的操作时,通常意味着它们以某种方式链接并且可以分组,例如在散列中:
data = {:foo1 => "1", :foo2 => "2", ...}
data2 = Hash[data.map { |key, value| [key, value.to_i - 1] }]
请注意,我不是更新inplace值而是创建一个新对象,而是通常更清晰的功能方法。
答案 3 :(得分: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]
但是,正如其他人所暗示的那样,事先将所有内容放入数组中会更明确。
答案 4 :(得分:0)
将它们放入数组中是最简单的事情。
%w{ 1 2 3 4 5 6 7 8 }.map!(&:to_i).map!(&:pred)
=> [0, 1, 2, 3, 4, 5, 6, 7]