您好我是学习Ruby的学生。我正在使用quick start guide at ruby-lang.org,它有一些Ruby基础知识的例子。
我研究了MegaGreeter
课程,我试图找出同一puts
中name
两个论点(age
和each
}的方法块以简化我的代码。
我认为会有另一种方式。 (使用常规循环代替each
。)
计算数组的大小。
使用C中的循环。
但我想使用each
循环。以下是我的代码:
class MegaGreeter
attr_accessor :name
attr_accessor :age
#Creat the object
def initialize(name=nil, age=0)
@name = name
@age = age
@tmp = Array.new()
@i = 0
end
#Say hi to everybody
def say_hi
if @name.nil?
puts "please give me the input !!"
elsif @name.respond_to?("each")
#list responding
@name.each do |name|
@tmp[@i] = "hi ~! #{name}"
@i += 1
end
@i=0
@age.each do |age|
@tmp[@i] += " and you are #{age} years old"
puts @tmp[@i]
@i += 1
end
else
puts "give me array ~"
end
end
end
a = MegaGreeter.new()
a.name = ["juno","yoonhe"]
a.age = [1,2]
a.say_hi
答案 0 :(得分:6)
您可以使用Array
方法zip
首先合并两个数组。它按元素在数组中的位置对元素进行分组,因此@name
数组的第一个元素将与@age
数组的第一个元素组合在一起,依此类推。
@name = ['Foo', 'Bar']
@age = [23, 41]
name_and_age = @name.zip(@age)
# [['Foo', 23], ['Bar' 41]]
现在将名称和年龄组合在一起,您可以使用each
对其进行迭代。
name_and_age.each do |name, age|
puts name, age
end
# Foo 23
# Bar 41
将其重新放回原始代码:
class MegaGreeter
attr_accessor :name, :age
#Creat the object
def initialize(name = nil, age = 0)
@name = name
@age = age
end
#Say hi to everybody
def say_hi
if @name.nil?
puts "please give me the input !!"
elsif @name.respond_to?("each")
#list responding
@name.zip(@age).each do |name, age|
puts "hi ~! #{name} and you are #{age} years old"
end
else
puts "give me array ~"
end
end
end