Fixnum类方法修改

时间:2014-06-28 04:16:37

标签: ruby

这是我正在为代码大战工作的代码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。我不确定我做错了什么。有人能指出我正确的方向吗?

1 个答案:

答案 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

我改变了什么:

  1. 您添加self_placeholder是对的 - 我将此变量命名为num。在Ruby中,Fixnum是不可变的,因此您无法更改特定Fixnum本身的值。
    • 我在开头时从num减去1,以避免在结果数组中包含数字本身
  2. palindrome_below(base)需要是一个实例方法。您非常关心Fixnum类的特定实例的值(即,数字的值)。
  3. 您需要在num声明之外的if中减去1。
  4. 我颠倒了palindrome_match数组,使其以正确的升序返回。
  5. 远远优越的解决方案(由@ CarySwoveland上述评论提供)。

    class Fixnum
        def palindrome_below(base)
            1.upto(self-1).select { |num| num.to_s(base) == num.to_s(base).reverse }
        end
    end