1

例如,我想向 class 添加新方法String。但我不想让这种改变全球化(保持班级清洁很好,是吗?)。

所以,而不是这段代码

class String
  def is_palindrome?
    self == self.reverse
  end
end

module MyModule
  class MyClass
    def filter_palindrome(str_arr)
      str_arr.select { |s| s.is_palindrome? }
    end
  end
end

我想要这样的东西:

module MyModule
  class String
    def is_palindrome?
      self == self.reverse
    end
  end

  class MyClass
    def self.filter_palindrome(str_arr)
      str_arr.select { |s| s.is_palindrome? }
    end
  end
end

但是,当然,它不起作用(undefined method 'is_palindrome?' for :String)。那么,我想要的有什么意义吗?如果有,实现它的最佳方法是什么?

4

1 回答 1

1

如果您使用的是 Ruby 2.0,您可以尝试改进

module MyModule
  module StringAlter
    refine String do
      def is_palindrome?
        self == self.reverse
      end
    end
  end
end

using MyModule::StringAlter
module MyModule
  class MyClass
    def self.filter_palindrome(str_arr)
      str_arr.select { |s| s.is_palindrome? }
    end
  end
end

如果在 Ruby 2.0 之前,您无法直接实现这一点。对 String 所做的更改将是全局的。但是,s.is_palindrome?为什么不编写一个辅助方法并调用它,而不是is_palindrome?(s). 然后您不必重新打开String,您可以限制is_palindrome?为仅在某些给定范围内可用。

这是 Python 所做的 ( self) 以及 C# 扩展方法。

于 2013-03-29T11:59:56.800 回答