读取定义数量的数字没有数组

时间:2015-09-07 17:36:39

标签: ruby-on-rails ruby

通常在我的任务中,我必须阅读先前定义的数量,当然我知道它们是如何分开的。例如,假设它是用空格分隔的两个坐标。以下是我实际阅读本行的内容:

line = gets.split(' ').map(&:to_i)

没关系,但我必须致电line[0] .. line[1]或为a = line[0] ...添加两行

有没有办法读取定义的数字并将它们分配给变量,而不是数组

EDIT / TL:DR :换句话说:我正在寻找Ruby的scanf("%d %d", &x, &y);

2 个答案:

答案 0 :(得分:3)

这样做:

x, y = gets.split(' ').map(&:to_i)

puts "x: #{x}"
puts "y: #{y}"

答案 1 :(得分:0)

如果您不知道字符串中有多少个值,则无法将每个值分配给局部变量。那是因为你不能使用并行赋值(参见我对@K的答案的评论),并且,自Ruby v1.9起,你无法动态定义局部变量(例如,eval("x=1")不起作用。)

您可以动态地将值分配给实例变量,如下所示:

arr = gets.chomp.split(/\s+/)

arr = gets.split(/\s+/).map(&:to_i)

取决于您的需求。

假设

arr = [1, 2, 3, 4]

然后:

arr.each_with_index { |x,i| instance_variable_set("@my_var#{i}", x) }

instance_variable_get(:@my_var0) #=> 1 
instance_variable_get(:@my_var1) #=> 2 
instance_variable_get(:@my_var2) #=> 3 
instance_variable_get(:@my_var3) #=> 4 

但你为什么要这样做?

修改

您知道gets将返回一个字符串,其中包含两个表示整数的子字符串,由一个或多个空格分隔,并且您希望将这两个整数分配给变量xy

我希望您不介意创建未命名的临时数组,您只是不需要任何命名数组,例如:

arr = gets.map(&:to_i)
x,y = arr

但是,如果您想在不创建任何数组的情况下执行此操作,则可能会有效:

s = gets                   #=> "1  -2\n"
x = s[/(-?\d+)\s/,1].to_i  #=>  1
y = s[/\s(-?\d+)/,1].to_i  #=> -2

我说“可能”,因为我不知道Ruby是否在后台创建任何数组供自己使用。

或者,您可以使用正面外观并且不使用捕获组:

x = s[/-?\d+(?=\s)/].to_i  #=>  1
y = s[/(?<=\s)-?\d+/].to_i #=> -2