2017-02-23 5 views
0

Ich möchte diesen Code Refactoring:Wie verwende ich einen Alias ​​mit Parametern in Ruby?

class Logger 
    class << self 
     def info title, msg 
     puts hash_for(title, msg, :info).to_json 
     end 

     def unknown title, msg 
     puts hash_for(title, msg, :unknown).to_json 
     end 

in so etwas wie:

def print title, msg, level 
    puts hash_for(title, msg, level).to_json 
end 
alias :info, :print 
alias :unknown, :print 

Aber ich brauche das Argument zu injizieren, die alias und alias_method scheinen nicht zu unterstützen.

Rubin 2.3

Antwort

0

Soweit ich weder alias noch alias_method Unterstützung Argumente kennen.

Sie könnten die Methoden explizit wie folgt definieren:

def print(title, msg, level) 
    puts hash_for(title, msg, level).to_json 
end 

def info(*args) 
    print(*args) 
end 

# More concise... 
def unknown(*args); print(*args); end 
0

alias ein eingebaut ist und nicht einen Parameter in der Tat alias info print ohne Doppelpunkte oder Kommas syntaktisch korrekt unterstützen. Aber alias_method sollte funktionieren. Das Folgende funktionierte für mich:

class G 

    def print 
    puts 'print' 
    end 

    a = :print 
    b = :info 
    alias_method b, a 

end 

G.new.info 
1

Sie können dies mit Meta-Programmierung tun!

class Logger 
    def self.define_printer(level) 
    define_singleton_method(level) do |title, msg| 
     print(title, msg, level) 
    end 
    end 

    def self.print(title, msg, level) 
    puts hash_for(title, msg, level).to_json 
    end 

    define_printer :info 
    define_printer :unknown 
end 

Logger.info('foo', 'bar') 
# calls print with ["foo", "bar", :info] 

Bearbeiten: Für zusätzlichen Kredit, machte ich eine allgemeinere Version.

class Object 
    def curry_singleton(new_name, old_name, *curried_args) 
    define_singleton_method(new_name) do |*moreArgs| 
     send(old_name, *curried_args.concat(moreArgs)) 
    end 
    end 
end 

class Foobar 
    def self.two_arg_method(arg1, arg2) 
    p [arg1, arg2] 
    end 

    curry_singleton(:one_arg_method, :two_arg_method, 'first argument') 
end 
Foobar.one_arg_method('second argument') 
#=> ["first argument", "second argument"] 
+0

Ja, das scheint ein guter Weg zu sein ... –

Verwandte Themen