Как `Object#define_singleton_method(symbol, method)` работает в ruby?
От Doc of define_singleton_method
У меня есть два синтаксиса, чтобы определить singleton
метод, как показано ниже:
define_singleton_method (symbol) {block} -> proc:
С приведенным выше синтаксисом я попробовал приведенный ниже код и синтаксис, который я понял:
define_singleton_method :foo do |params = {}|
params
end
#=> #<Proc:0x20e6b48@(irb):1 (lambda)>
foo
#=> {}
foo(bar: :baz)
#=> {:bar=>:baz}
foo(bar: :baz ,rar: :gaz )
#=> {:bar=>:baz, :rar=>:gaz}
Но нужна чья-то помощь, чтобы выяснить один пример каждого с синтаксисом ниже.
define_singleton_method (символ, метод) -> новый_метод
согласно документу - параметр метода может быть Proc
, Method
или UnboundMethod
объект. Я не получил никаких примеров там.
Может ли кто-нибудь помочь мне здесь, чтобы получить один пример против курсивных слов?
2 ответа
Proc
Объект создан с помощью lambda
, proc
, ->
, Proc.new
или &
синтаксис в списке параметров. Method
объект может быть получен с помощью method
метод и UnboundMethod
можно получить с помощью instance_method
метод. Итак, вот примеры каждого из них:
p = Proc.new {|x| puts x}
m = method(:puts)
um = Object.instance_method(:puts)
define_singleton_method(:my_puts1, p)
define_singleton_method(:my_puts2, m)
define_singleton_method(:my_puts3, um)
my_puts1 42
my_puts2 42
my_puts3 42
С Proc
:
define_singleton_method(:foo, proc{ 'foo' })
foo #=> 'foo'
С Method
:
oof = 'oof'
oof.define_singleton_method(:foo, oof.method(:reverse))
oof.foo #=> "foo"
С UnboundMethod
:
oof = 'oof'
oof.define_singleton_method(:foo, String.instance_method(:reverse))
oof.foo #=> "foo"