在Ruby中创建FizzBu​​zz类

时间:2015-01-12 05:03:11

标签: ruby-on-rails ruby class object fizzbuzz

我正在尝试创建一个fizzbuzz类,但我觉得好像我还没有完全理解Ruby中的类和对象是如何工作的。

这是我试图解决的问题如下:

构建一个名为FizzBu​​zz的类,它将两个数字作为参数,然后有一个名为run的方法,返回一个fizzbuzz数组(数字从1到100,可被第一个数字整除的数字被' fizz'和号码替换为第二个号码替换为' buzz'以及被两者整除的号码替换为' fizzbuzz')。例如,此代码应该适用于您的类:

fb = FizzBuzz.new(3,5)
fb.run # returns an array like: [1, 2, 'fizz', 4, 'buzz, ..]

之后我需要修改我的解决方案以使其灵活,并且能够在创建对象后更改数字。我此刻并不那么担心这个部分!

这是我到目前为止所做的:

class FizzBuzz(num1, num2)
  def run
    nums = [1..100]
    for i in nums
      if i % num1 == 0 && i % num2 == 0
        puts "fizbuzz"
      elsif i % num1 == 0 
        puts "fizz"
      elsif i % num2 == 0
        puts "buzz"
      else puts i
    end
  end
end

fb = FizzBuzz.new(3, 5)
fb.run 

干杯,

Brandyn

2 个答案:

答案 0 :(得分:0)

以下是对您的代码进行的最小更改:

class FizzBuzz
  attr_reader :num1, :num2

  def initialize(num1, num2)
    @num1, @num2 = num1, num2
  end

  def run
    1.upto(100).each do |i|
      if i % num1 == 0 && i % num2 == 0
        puts "fizbuzz"
      elsif i % num1 == 0
        puts "fizz"
      elsif i % num2 == 0
        puts "buzz"
      else puts i
      end
    end
  end
end

fb = FizzBuzz.new(3, 5)
fb.run

首先,您应该定义构造函数(.initialize)方法,该方法将接受您的num1num2参数,然后,要在类中使用,我将它们分配给实例变量(前缀为@)。要读取没有此前缀的文件(在run中),我定义attr_reader :num1, :num2,它只创建2个方法来访问这些实例变量。最后,在Ruby中,我们更喜欢迭代器来循环,所以我将for替换为upto

答案 1 :(得分:0)

你想用fizz和buzz修改数组,但你现在所做的只是puts,它会输出单词而不是修改数组,返回数组仍然是数组1 ..100。
另外[1..100]是单个范围的数组,而不是100个数字的数组 为了能够使用两个参数进行初始化,您需要初始化函数,然后将这两个numnber保存为实例变量 编辑:我将fizzbuzz逻辑引入单独的方法,并使用map为每个数字调用此方法。
因此,在这些修改之后,您的代码将如下所示

class FizzBuzz
  def initialize(num1, num2)
    @n1 = num1
    @n2 = num2
  end
  def run
    nums = (1..100).to_a
    nums.map {|n| fizz_or_buzz(n,@n1,@n2)} 
  end

  def fizz_or_buzz(number, n1, n2)
    if number % n1 == 0 && number % n2 == 0
      'fizzbuzz'
    elsif number % n1 == 0
      'fizz'
    elsif number % n2 == 0
      'buzz'
    else
      number
    end
  end

end

fb = FizzBuzz.new(3, 5)
fb.run

为了能够修改这些值,您可以创建一个名为change的新方法,它将替换两个实例变量

def change(n1, n2)
  @num1 = n1;
  @num2 = n2;
end

然后运行

fb.change(1,2)
fb.run