【问题标题】:Creating a FizzBuzz Class in Ruby在 Ruby 中创建 FizzBu​​zz 类
【发布时间】:2015-01-12 05:03:11
【问题描述】:

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

这是我要解决的问题如下:

构建一个名为 FizzBu​​zz 的类,它接受两个数字作为参数,然后有一个名为 run 的方法返回一个 fizzbuzz 数组(从 1 到 100 的数字,被第一个数字整除的数字被 'fizz' 替换,数字被第二个替换数字替换为“嗡嗡声”和可被两者整除的数字替换为“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 

干杯,

布兰丁

【问题讨论】:

  • 除了你第一次偶然发现的想法之外,还有什么理由实现这样的算法吗?

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


【解决方案1】:

以下是对其代码进行的最小更改,以使其正常工作:

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

【讨论】:

    【解决方案2】:

    你想用嘶嘶声和嗡嗡声修改数组,但你现在做的只是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
    

    【讨论】:

    • 谢谢你 mohammed.. 你(或任何人)能否向我解释为什么我们在 run 方法中使用实例变量而不是 fizz_or_buzz 方法??
    • 你想创建一个fb的实例,这个实例应该记住你在开始时给它的数字,所以你可以多次运行run而不需要给它两个数字,所以要保存这些数字,你创建 instance variablesm 另一个方法 fizz_or_buzz 不需要记住任何东西,它接收变量并同时返回结果,所以我不需要它记住任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2018-07-18
    • 2012-11-04
    • 1970-01-01
    • 2016-01-15
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多