这是我正在为代码大战工作的代码kata的描述。 kata的目标是实现这一目标:
<小时/> 这个Kata的目的是修改Fixnum类,为它提供palindrome_below方法。此方法返回所有数字,包括1,但不包括自身,这些数字是给定基数的回文。
例如在基数2(二进制)
中 1 = "1"
2 = "10"
3 = "11"
4 = "100"
因此,1和3是基础2中的回文,该方法应返回以下内容。
5.palindrome_below(2)
=> [1, 3]
以下是我为此kata编写的代码:
class Fixnum
def self.palindrome_below(binary)
palindrome_match = []
until self == 0
if to_s(binary) == to_s(binary).reverse
palindrome_match << self
self -= 1
end
end
palindrome_match
end
end
我尝试将self
减少1
。 Sublime告诉我,我无法降低self
的值,但我需要减少self
。因为这是一个类方法,所以我需要修改self
。
这是我尝试解决的问题:
class Fixnum
def self.palindrome_below(binary)
palindrome_match = []
self_placeholder = self
until self_placeholder == 0
if self_placeholder.to_s(binary) == self_placeholder.to_s(binary).reverse
palindrome_match << self_placeholder
self_placeholder -= 1
end
end
palindrome_match
end
end
这一次,我将self
放在一个包装变量中,以便我可以修改它。当我尝试这个时,它说有一个名为palindrome_below
的未定义方法。执行此实现应该猴子修补Fixnum
。我不确定我做错了什么。有人能指出我正确的方向吗?
答案 0 :(得分:1)
class Fixnum
def palindrome_below(base)
palindrome_match = []
num = self - 1
until num == 0
if num.to_s(base) == num.to_s(base).reverse
palindrome_match << num
end
num -= 1
end
palindrome_match.reverse
end
end
我改变了什么:
self_placeholder
是对的 - 我将此变量命名为num
。在Ruby中,Fixnum
是不可变的,因此您无法更改特定Fixnum
本身的值。
num
减去1,以避免在结果数组中包含数字本身palindrome_below(base)
需要是一个实例方法。您非常关心Fixnum类的特定实例的值(即,数字的值)。num
声明之外的if
中减去1。palindrome_match
数组,使其以正确的升序返回。class Fixnum
def palindrome_below(base)
1.upto(self-1).select { |num| num.to_s(base) == num.to_s(base).reverse }
end
end