Существует ли способ знать метод вызова?

Я сказал бы, что по всей вероятности вся библиотека анимации в JS использует приправление карри. Вместо того, чтобы иметь необходимость передать для каждого вызова ряд затронутых элементов и функции, описывая, как элемент должен вести себя к функции высшего порядка, которая гарантирует весь материал синхронизации, его обычно легче для клиента выпустить, как общедоступный API некоторая функция как "slideUp", "постепенное появление", которое берет только элементы в качестве аргументов, и которое является просто некоторой функцией с приправой карри, возвращая высокого уровня функцию со встроенной "функцией анимации" по умолчанию.

6
задан DOK 7 December 2009 в 13:42
поделиться

4 ответа

Реализация Ruby Kernel # caller выполнена с String для повышения производительности и сборки мусора. Если вы хотите провести более сложный анализ стека вызовов, взгляните на это сообщение в блоге:

http://eigenclass.org/hiki/ruby+backtrace+data

Автор рассматривает две различные реализации лучшего граф объектов стека вызовов, один из которых реализован на чистом Ruby с (малоизвестным) методом Kernel # set_trace_func , а другой работает как расширение C для MRI.

Производственное приложение не должно использовать ничего другого чем реализация Kernel # caller , поставляемая с Ruby. Если вы широко используете указанные выше расширения, вы

1
ответ дан 8 December 2019 в 17:22
поделиться

Вы можете написать что-то вроде этого:

module Kernel
  private
  def who_is_calling? # Or maybe def who_just_called?
    caller[1] =~ /`([^']*)'/ and $1
  end
end

А затем у вас есть эти небольшие тесты :

irb(main):056:0*   def this_is_a_method
irb(main):057:1>     puts "I, 'this_is_a_method', was called upon by: '#{who_is_calling?}'"
irb(main):058:1>   end
=> nil
irb(main):059:0>   def this_is_a_method_that_calls_another
irb(main):060:1>     this_is_a_method
irb(main):061:1>   end
=> nil
irb(main):062:0> this_is_a_method_that_calls_another
I, 'this_is_a_method', was called upon by: 'this_is_a_method_that_calls_another'
=> nil
irb(main):063:0> this_is_a_method
I, 'this_is_a_method', was called upon by: 'irb_binding'
=> nil
irb(main):064:0>
0
ответ дан 8 December 2019 в 17:22
поделиться

Исследование стека вызовов Ruby содержит следующую информацию:

Хотели ли вы когда-нибудь просмотреть стек вызовов, не создавая исключения для этого?

caller.each {|c| puts c}
10
ответ дан 8 December 2019 в 17:22
поделиться

Обратите внимание, что ваша копия стандарта устарела и содержит известную (и исправленную) ошибку только в 1-й и 3-й строках кода вашего примера, см.:

3
ответ дан 8 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

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