2015-01-12 30 views
0

我试图创建一个fizzbuzz类,但是我感觉好像我不完全理解Ruby中的类和对象是如何工作的。在Ruby中创建一个FizzBu​​zz类

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

建立一个类中调用FizzBu​​zz采用两个数字作为参数,然后有一个方法调用,运行,从1回fizzbuzz阵列(号码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

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

0

你要修改的香味与和巴斯的数组,但你当前做的仅仅是puts将输出的话,但不修改数组,返回数组仍然是数组1..100。
另外[1..100]是单个范围的数组,而不是100个数字的数组。
要使用两个参数进行初始化,您需要一个初始化函数,然后将这两个numnbers作为实例变量保存。
编辑:我将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 
+0

谢谢穆罕默德..你可以(或任何人的事)请向我解释为什么我们在run方法中使用实例变量,但不是fizz_or_buzz方法? –

+0

你想创建一个'fb'的实例,这个实例应该记住你每次开始给它的数字,所以你可以多次运行'run'而不需要给它两个数字,所以为了节省这些你创建'instance'变量的数字另一个方法'fizz_or_buzz'不需要记住任何事物,它会收到变量并同时返回结果,所以我不需要记住任何事情。 –

相关问题