我正在尝试创建一个fizzbuzz类,但我觉得好像我还没有完全理解Ruby中的类和对象是如何工作的。
这是我试图解决的问题如下:
构建一个名为FizzBuzz的类,它将两个数字作为参数,然后有一个名为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
答案 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
)方法,该方法将接受您的num1
和num2
参数,然后,要在类中使用,我将它们分配给实例变量(前缀为@
)。要读取没有此前缀的文件(在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