如何组合两个块来简化我的代码?

Jun*_* Im 2 ruby

嗨,我是学习Ruby的学生.我正在使用ruby-lang.org上快速入门指南,它有一些Ruby基础知识的例子.

我研究了这个MegaGreeter类,我试图弄清楚如何在同一个块中使用puts两个参数(nameage)each来简化我的代码.

我认为会有另一种方式.(使用常规循环代替each.)

  1. 计算数组的大小.

  2. 使用像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)

Dre*_*nmi 6

您可以使用该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)