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

你不应该使用它, 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 回答
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

根据您对@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

将它们放在一个数组中将是最简单的事情。

%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 回答