1

Stringたとえば、新しいメソッドを class に追加したいとします。しかし、私はこの変更をグローバルにしたくありません (クラスをきれいに保つことは良いことですよね?)。

したがって、このコードの代わりに

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 に答える