2016-10-14 9 views
5

シングルトンエイリアスメソッドを定義しようとしています。 のように:メソッドを単一のオブジェクトにエイリアスする

name = 'Bob' 
# I want something similar to this to work 
name.define_singleton_method(:add_cuteness, :+) 
name = name.add_cuteness 'by' 

私は2番目のパラメータとしてメソッドオブジェクトを渡すことができます確信しています。

私は、私はそれを使用しないString#+方法をエイリアスしたいこの

name.define_singleton_method(:add_cuteness) { |val| self + val } 

ようにそれを行うにはしたくないでしょう。 エイリアスを強調していますが、実際のメソッドオブジェクトを2番目のパラメータとして送信することもすばらしくなります。

+1

あなたはそれが不変である整数で 'define_singleton_method'することはできません。

class Object def define_singleton_alias(new_name, old_name) singleton_class.class_eval do alias_method new_name, old_name end end end rob = 'Rob' bob = 'Bob' bob.define_singleton_alias :add_cuteness, :+ bob.add_cuteness 'by' # => "Bobby" rob.add_cuteness 'by' # => NoMethodError 

Object#define_singleton_methodは基本的にはこのような何かを行います – bjhaid

+0

@bjhaid true。私はそれを 'String'に変更しました –

+1

' name = 'Bob'; name.define_singleton_method(:add_cuteness、&name.method(:+)); name = name.add_cuteness 'by'#=> 'Bobby''これはあなたが欲しいものですか? – bjhaid

答えて

6

シングルトンメソッドは、そのオブジェクトのシングルトンクラスに含まれています。

def define_singleton_method(name, &block) 
    singleton_class.class_eval do 
    define_method name, &block 
    end 
end 
+0

[Module#alias_method](https://ruby-doc.org/core-2.2.2/Module-.html#method-i-alias_method)は、その引数がシンボルまたは文字列であることを許可します: 'bob '#=>' Bobby ''によって.add_cuteness'を追加しました。 –

関連する問題