Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将多个字符串变量更改为整数和负1?_Ruby - Fatal编程技术网

Ruby 如何将多个字符串变量更改为整数和负1?

Ruby 如何将多个字符串变量更改为整数和负1?,ruby,Ruby,我想将8个字符串更改为整数类型和-1。我将代码编写为: foo1, foo2, too3 ... = foo1.to_i - 1, foo2.to_i - 1, foo3.to_i -1, ... 但我觉得太复杂了。有没有更好的方法来实现这个目标?你不应该使用这个,评估是危险的和动态的。我建议将您的值移动到一个可以控制键的散列中。如果你想按照你的要求去做: (1..2).map {|n | eval("foo#{n}").to_i - 1} 例如: > foo1 = 2 => 2

我想将8个字符串更改为整数类型和-1。我将代码编写为:

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

但我觉得太复杂了。有没有更好的方法来实现这个目标?

你不应该使用这个,评估是危险的和动态的。我建议将您的值移动到一个可以控制键的散列中。如果你想按照你的要求去做:

(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]  

你误解了我。。foo1,foo2只是指参数的名称,它们可能是
anyletters=“123”,另一个=“456”
,@jdoe实际上不是。。。问题可以已经有标签了。它充其量是多余的。@jdoe谢谢,我想让它更明显。@Tony在那张小小的图片上,它说了三遍“ruby”。你需要有多明显?你成功了并引起了我的注意。你必须在不同的地方保留所有这些价值观吗?将相同的操作应用于所有对象这一事实表明,它们之间可能存在某种联系,将它们全部保存在某种数据结构中可能是合理的。这样,使您在此处显示的代码更简洁就容易多了。@AlexD修复了!我被前一个标题蒙蔽了双眼:)
%w{ 1 2 3 4 5 6 7 8 }.map!(&:to_i).map!(&:pred)
=> [0, 1, 2, 3, 4, 5, 6, 7]