0

文字列または記号を取り (それを文字列に変換)、HashWithIndifferent アクセスの動作と同じように、文字列または記号と交換可能に比較できるオブジェクトが必要です。

StringWithIndifferentAccess.new("foo").include? :f
=> true

StringWithIndifferentAccess.new(:foo) ==  "foo"
=> true

すべての文字列メソッドを手動で再定義しなくても、これを簡単に実行して「そのまま動作させる」(TM) 方法はありますか?

4

2 に答える 2

3

これはあなたの例を渡します

class StringWithIndifferentAccess
  def initialize obj
    @string = obj.to_s
  end

  def == (other)
    @string == other.to_s
  end

  def include?(other)
    @string.include? other.to_s
  end
end

アップデート

だから私はもう一度質問を読み、すべての文字列メソッドに対して「正しく機能する」ために、method_missingを使用して、任意の記号を次のような文字列に変換できます。

class StringWithIndifferentAccess
  def initialize obj
    @string = obj.to_s
  end

  # Seems we have to override the == method because we get it from BasicObject
  def == (other)
    @string == other.to_s
  end

  def method_missing(method, *args, &block)
    args.map! {|arg| arg.is_a?(Symbol) ? arg.to_s : arg }
    if @string.respond_to?(method)
      @string.send(method, *args, &block)
    else
      raise NoMethodError  
    end    
  end
end
于 2013-01-11T18:13:18.060 に答える
0

これを使用できます:

sym = :try
sym.class
=> Symbol
str = "try"
str.class
=> String
str.to_sym
=> :try
sym.to_s
=> "try"

したがって、シンボルまたは文字列を使用して構築され、常に文字列である値を持つクラスを作成するだけです。単一の引数を取り、それを文字列に変換し、値に対してそれを呼び出すメソッド undefined を追加します。

これが役立つことを願っています。

于 2013-01-11T16:58:56.867 に答える