0

我正在尝试创建一个 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 

干杯,

布兰登

4

2 回答 2

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参数,然后,为了在类中使用,我将它们分配给实例变量(带有前缀@)。为了在没有这个前缀(in run)的情况下阅读它们,我定义attr_reader :num1, :num2了它只是创建了 2 个方法来访问这些实例变量。最后,在 Ruby 中,我们更喜欢迭代器而不是循环,所以我将你的替换forupto

于 2015-01-12T05:13:57.873 回答
0

你想用嘶嘶声和嗡嗡声修改数组,但你现在做的只是puts输出单词而不修改数组,返回数组仍然是数组 1..100。
此外 [1..100] 是单个范围的数组,而不是 100 个数字的数组。
为了能够使用两个参数进行初始化,您需要一个初始化函数,然后将这两个数字保存为实例变量。
编辑:我将 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
于 2015-01-12T05:17:45.810 回答