В Ruby все, как предполагается, является объектом. Но у меня есть большая проблема для получения до функционального объекта, определил обычный путь, как
def f
"foo"
end
В отличие от этого, в Python, f является функциональным результатом, не самой функцией. Поэтому f()
, f
, ObjectSpace.f
все "foo"
. Также f.methods
возвраты просто представляют список методов в виде строки.
Как я получаю доступ к самому функциональному объекту?
Вы просто используете метод метод
. Это вернет экземпляр 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, :[], ...]
Надеюсь, это поможет.
хорошо, я сам нашел ответ
obj = method :f
спасибо всем за вдохновение :)
Метод метод
предоставит вам a Метод
объект
f = obj.method :f
puts f.call # or f[]
this f
привязан к obj. Вы также можете получить несвязанный метод:
unbound_plus = Fixnum.instance_method('+')
plus_2 = unbound_plus.bind(2)
(Существует также метод отмены привязки)
Это не функция; это метод объекта. Если вы хотите получить объект, представляющий метод, вы запрашиваете его у объекта-владельца:
someobj.method :f
Например:
plus_one = 1.method :+
plus_one[9] # 10
Вы должны создать объект 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]
В Руби то, что ты просишь, не имеет смысла. (Это имеет смысл в таких языках, как Python, JavaScript, Java и C#.)
В Ruby вы можете сказать классу, на какие сообщения он должен ответить и каким образом он должен ответить на эти сообщения. Самый распространенный способ сказать классу, что это определить метод в классе. Но опять же, это просто означает: когда кто-то посылает сообщение f
этому экземпляру, вот поведение, с которым этот экземпляр должен ответить. Объекта функции нет.
Можно делать такие вещи, как получить символ (имя_метода = :foo
) и получить закрытие (метод = proc { obj.foo }
).
Вы можете получить объект, который будет соответствовать этой функции во время выполнения, но, насколько я знаю, нет эквивалента тому, что Python позволяет делать прямо здесь, в определении функции/класса.
Надеюсь, кто-нибудь докажет, что я ошибаюсь, но я никогда не мог этого сделать.