2016-10-14 42 views
5

Tek bir ad takma yöntemini tanımlamaya çalışıyorum. As:Tek bir nesneyi diğer yöntemle hizala

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

I ikinci bir parametre olarak bir yöntem nesnenin geçebileceği emin.

Ben bunu kullanmaz String#+ yöntemi diğer ad istiyorum bu

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

gibi yapmak istemem. Takma ad üzerinde vurgulama, ancak gerçek yöntem nesnesini ikinci bir parametre olarak gönderme de havalı olur.

+1

değil 'define_singleton_method' bir tamsayı üzerinde değişmez olduğunu olabilir – bjhaid

+0

@bjhaid true. 'String' –

+1

'name = 'Bob' olarak değiştirdim; name.define_singleton_method (: add_cuteness & name.method (: +)); name = name.add_cuteness 'by' # => 'Bobby'' istediğin bu mu? – bjhaid

cevap

6

Tekil yöntemler o nesnenin tekil sınıfında yer almaktadır:

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 temelde böyle bir şey yapar:

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

Bu durumda, [Module # alias_method] (https://ruby-doc.org/core-2.2.2/Module.html#method-i-alias_method) argümanlarının sembol veya dizge olmasını sağlar: .add_cuteness 'by' # => "Bobby". –