嗨,我是学习Ruby的学生.我正在使用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
Run Code Online (Sandbox Code Playgroud)
您可以使用该Array方法zip首先合并两个数组.它按元素在数组中的位置对元素@name进行分组,因此数组的第一个元素将与数组的第一个元素组合在一起@age,依此类推.
@name = ['Foo', 'Bar']
@age = [23, 41]
name_and_age = @name.zip(@age)
# [['Foo', 23], ['Bar' 41]]
Run Code Online (Sandbox Code Playgroud)
现在名称和年龄组合在一起,您可以使用它们迭代它们each.
name_and_age.each do |name, age|
puts name, age
end
# Foo 23
# Bar 41
Run Code Online (Sandbox Code Playgroud)
将其重新放回原始代码:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |