Получение самого объекта функции ruby
В Ruby все должно быть объектом. Но у меня есть большая проблема, чтобы добраться до объекта функции, определенного обычным способом, например
def f
"foo"
end
В отличие от Python, f является результатом функции, а не самой функцией. Поэтому f()
, f
, ObjectSpace.f
все "foo"
. Также f.methods
возвращает список только строковых методов.
Как мне получить доступ к самому объекту функции?
Ответы
Ответ 1
Вы просто используете метод method
. Это вернет экземпляр method
, соответствующий этому методу. Некоторые примеры:
>> def f
>> "foo"
>> end
=> nil
>> f
=> "foo"
>> method(:f)
=> #<Method: Object#f>
>> method(:f).methods
=> [:==, :eql?, :hash, :clone, :call, :[], ...]
>> class SomeClass
>> def f
>> "bar"
>> end
>> end
=> nil
>> obj = SomeClass.new
=> #<SomeClass:0x00000001ef3b30>
>> obj.method(:f)
=> #<Method: SomeClass#f>
>> obj.method(:f).methods
=> [:==, :eql?, :hash, :clone, :call, :[], ...]
Надеюсь, что это поможет.
Ответ 2
Метод method
даст вам объект method
f = obj.method :f
puts f.call # or f[]
этот f
связан с obj. Вы также можете получить несвязанный метод:
unbound_plus = Fixnum.instance_method('+')
plus_2 = unbound_plus.bind(2)
(Существует также метод unbind)
Ответ 3
Я сам нашел ответ
obj = method :f
Благодарю всех вас за вдохновение:)
Ответ 4
В Ruby то, о чем вы просите, не имеет смысла. (Это имеет смысл в таких языках, как Python, JavaScript, Java и С#.)
В Ruby вы можете указать классу, на какие сообщения он должен реагировать, и каким образом он должен реагировать на эти сообщения. Самый распространенный способ рассказать класс, который должен определять метод в классе. Но опять же, это просто означает: когда кто-то отправляет сообщение f
этому экземпляру, вот поведение, которое должен ответить экземпляр. Объект функции отсутствует.
Вы можете делать такие вещи, как получить символ (method_name = :foo
) и получить закрытие (method = proc { obj.foo }
).
Ответ 5
Это не функция; это метод объекта. Если вы хотите получить объект, представляющий метод, вы запрашиваете для него объект-владелец:
someobj.method :f
Например:
plus_one = 1.method :+
plus_one[9] # 10
Ответ 6
Вы можете получить объект, который будет соответствовать этой функции во время выполнения, но насколько я знаю, нет никакого эквивалента тому, что Python позволяет вам делать прямо там, в определении функции/класса.
Надеюсь, кто-то докажет, что я ошибаюсь, но я никогда не мог его снять.
Ответ 7
Вы должны создать объект Proc
, если хотите объект функции
f = Proc.new { |x| x * 2 }
вы вызываете функцию, используя
f.call(8) # => 16
или
f[8] # => 16
вы можете даже использовать этот функциональный объект в операции map
[1, 2, 3, 4, 5].map(&f) # => [2, 4, 6, 8, 10]