Получение самого объекта функции 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]