我想将 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" }
虽然如果你决定这样做是个坏主意。
你不应该使用它, 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}
当您使用 8 个变量并需要对它们执行相同的操作时,通常意味着它们以某种方式链接并且可以分组,例如在哈希中:
data = {:foo1 => "1", :foo2 => "2", ...}
data2 = Hash[data.map { |key, value| [key, value.to_i - 1] }]
请注意,我不是更新就地值,而是创建一个新对象,功能方法通常更清晰。
根据您对@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]
但是,正如其他人所建议的那样,预先将所有内容放在一个数组中更为明确。
将它们放在一个数组中将是最简单的事情。
%w{ 1 2 3 4 5 6 7 8 }.map!(&:to_i).map!(&:pred)
=> [0, 1, 2, 3, 4, 5, 6, 7]