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

时间:2015-04-18 02:37:33

标签: ruby

您好我是学习Ruby的学生。我正在使用quick start guide at ruby-lang.org,它有一些Ruby基础知识的例子。

我研究了MegaGreeter课程,我试图找出同一putsname两个论点(ageeach}的方法块以简化我的代码。

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

  1. 计算数组的大小。

  2. 使用C中的循环。

  3. 但我想使用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
    

1 个答案:

答案 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