Как `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"
Другие вопросы по тегам