1

Enumerablesモジュールのコードを作成しました。

module Enumerables
  def palindrome?
    if self.is_a?(Hash)
      return false
    else
      self.join('').gsub(/\W/,"").downcase == self.join('').gsub(/\W/,"").downcase.reverse
    end
  end
end

問題は、私はこれらを書かなければならないということです:

class Array
  include Enumerables
end

class Hash
  include Enumerables
end

コードを正常に実行します。

「回文」を作成する簡単な方法はありますか?メソッドは異なるインスタンスタイプで実行されますか?

4

3 に答える 3

3

モジュールはそうではありませんEnumerablesEnumerable

module Enumerable
  def palindrome?
    ...
  end
end

インクルードなしで動作します。

このメソッドをすべてのオブジェクトに追加する場合は、texasbruceの回答を参照してください。

于 2012-10-15T23:48:14.617 に答える
1

オブジェクトレベルより下のクラスを開き、そこにこのメソッドを追加します。そうすれば、ほとんどすべての組み込みタイプとすべてのユーザー定義タイプにアクセスできるようになります。

あなたはそれをObjectKernel(それはモジュールです)、に入れることができますBasicObject

例えば、

class Object
  def foo
    puts "hello"
  end
end
[].foo
于 2012-10-15T23:54:35.547 に答える
0

ObjectSpace.each_objectフィルタでイテレータを使用して、Enumerableを含むクラスを検索し、それらを動的に拡張できます。

# XXX: this iterator yields *every* object in the interpreter!
ObjectSpace.each_object do |obj|
  if obj.is_a?(Class) && (obj < Enumerable)
    obj.module_eval { include Enumerables }
  end
end

[1,2,1].palindrome? # => true
{}.palindrome? # => false

ここでの秘訣は、すべての列挙可能なタイプに対して意味のある方法で機能するものを作成することです。この種のメタプログラミングはキックにとっては楽しいものですが、「おもちゃ」プログラム以外の目的で使用する場合は深刻な影響があることにも注意してください。

于 2012-10-15T23:46:23.680 に答える