Получение самого рубинового функционального объекта

В Ruby все, как предполагается, является объектом. Но у меня есть большая проблема для получения до функционального объекта, определил обычный путь, как

def f
    "foo"
end

В отличие от этого, в Python, f является функциональным результатом, не самой функцией. Поэтому f(), f, ObjectSpace.f все "foo". Также f.methods возвраты просто представляют список методов в виде строки.

Как я получаю доступ к самому функциональному объекту?

6
задан mykhal 19 December 2009 в 16:42
поделиться

7 ответов

Вы просто используете метод метод . Это вернет экземпляр 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, :[], ...]

Надеюсь, это поможет.

10
ответ дан 8 December 2019 в 13:46
поделиться

хорошо, я сам нашел ответ

obj = method :f

спасибо всем за вдохновение :)

2
ответ дан 8 December 2019 в 13:46
поделиться

Метод метод предоставит вам a Метод объект

f = obj.method :f
puts f.call # or f[]

this f привязан к obj. Вы также можете получить несвязанный метод:

unbound_plus = Fixnum.instance_method('+')
plus_2 = unbound_plus.bind(2)

(Существует также метод отмены привязки)

3
ответ дан 8 December 2019 в 13:46
поделиться

Это не функция; это метод объекта. Если вы хотите получить объект, представляющий метод, вы запрашиваете его у объекта-владельца:

someobj.method :f

Например:

plus_one = 1.method :+
plus_one[9] # 10
1
ответ дан 8 December 2019 в 13:46
поделиться

Вы должны создать объект 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]
0
ответ дан 8 December 2019 в 13:46
поделиться

В Руби то, что ты просишь, не имеет смысла. (Это имеет смысл в таких языках, как Python, JavaScript, Java и C#.)

В Ruby вы можете сказать классу, на какие сообщения он должен ответить и каким образом он должен ответить на эти сообщения. Самый распространенный способ сказать классу, что это определить метод в классе. Но опять же, это просто означает: когда кто-то посылает сообщение f этому экземпляру, вот поведение, с которым этот экземпляр должен ответить. Объекта функции нет.

Можно делать такие вещи, как получить символ (имя_метода = :foo) и получить закрытие (метод = proc { obj.foo }).

.
1
ответ дан 8 December 2019 в 13:46
поделиться

Вы можете получить объект, который будет соответствовать этой функции во время выполнения, но, насколько я знаю, нет эквивалента тому, что Python позволяет делать прямо здесь, в определении функции/класса.

Надеюсь, кто-нибудь докажет, что я ошибаюсь, но я никогда не мог этого сделать.

0
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: