2014-08-28 49 views
0

这是我想要做的,但它不工作。通过数组和提取元素的红宝石循环

array = [1,2,3,4,5] 

array.each do |val1, val2, val3, val4, val5| 
    puts "#{val1} topic is #{val2}, #{val3} topic is #{val4}, All topics ${val5}" 
end 
+1

在那里总是5个元素?会有更多?这两个词之间的逻辑是什么? – Anthony 2014-08-28 18:24:16

+1

你想让你的输出看起来像什么? – 2014-08-28 18:24:59

回答

1

array.each将要执行的块(doend之间的部分)一次每个元素在array中,每次使用该元素作为块的第一个参数。

这意味着执行了块中的第一时间,val1将等于1,和val2val3等将nil因为只有一个值被传递给该块。第二次执行块时,val1将等于2val2,val3等每次都会是nil

如果要将数组的元素提取到变量中,则不需要循环。所有你需要做的是这样的:

val1, val2, val3, val4, val5 = array 
puts "#{val1} topic is #{val2}, #{val3} topic is #{val4}, All topics #{val5}" 

这可能不是必要的,但是,因为你可以在你的字符串插值引用数组元素直接(#{...}):

puts "#{array[0]} topic is #{array[1]}, #{array[2]} topic is #{array[3]}, All topics #{array[4]}" 
0

如果这是在它们之间的元件和词语的固定阵列,只是做:

puts "#{array[0]} topic is #{array[1]}, #{array[3]} topic is #{array[4]}, All topics is #{array[5]}" 
0
array = [1,2,3,4,5] 
val1, val2, val3, val4, val5 = array 
puts "#{val1} topic is #{val2}, #{val3} topic is #{val4}, All topics #{val5}" 
2

您可以使用String#%方法:

puts "%d topic is %d, %d topic is %d, All topics $%d" % array 
+2

我是这种方法的粉丝,但你应该包含一个链接到['sprintf']的文档(http://www.ruby-doc.org/core-2.1.2/Kernel.html#method- i-sprintf),因为它描述了(许多)格式化选项。 – 2014-08-28 18:33:17

+1

你*欢迎*编辑* .. :-) – 2014-08-28 18:35:10

0

这里的一个方式,其允许的array元素是不同类型的对象,并为array具有可变长度(以特定的暗示方式定义)。

代码

def fmt(array) 
    (array[0..-2].each_slice(2) 
       .map { |e| e.join(' topic is ') } \ 
       << "all topics #{array.last}").join(', ') 
end 

实例

fmt [1,2,3,4,5,6,7] 
    #=> "1 topic is 2, 3 topic is 4, 5 topic is 6, all topics 7" 

fmt [2.1,3,"hi","ho",:a] 
    #=> "2.1 topic is 3, hi topic is ho, all topics a" 

array = ["First", "loops", "second", "methods", "third", "metaprogramming", 
     "are important for you to understand"] 

fmt(array) 
    #=> "First topic is loops, second topic is methods, third topic is " + 
    # "metaprogramming, all topics are important for you to understand" 
0

这里的一个方式,其允许的array元素是不同种类的对象和用于array为具有可变长度(定义在一种特别的,暗示的方式)。

代码

def fmt(array) 
    (array[0..-2].each_slice(2) 
       .map { |e| e.join(' topic is ') } 
       .push "all topics #{array.last}") 
       .join(', ') 
end 

实例

fmt([1,2,3,4,5,6,7]) 
    #=> "1 topic is 2, 3 topic is 4, 5 topic is 6, all topics 7" 

fmt([1,2.5,"cat","dog",:symbol]) 
    #=> "1 topic is 2.5, cat topic is dog, all topics symbol" 

array = ["First", "loops", "second", "methods", "third", "metaprogramming", 
     "are important for you to understand"] 

fmt(array) 
    #=> "First topic is loops, second topic is methods, third topic is " + 
    # "metaprogramming, all topics are important for you to understand"