Я сказал бы, что по всей вероятности вся библиотека анимации в JS использует приправление карри. Вместо того, чтобы иметь необходимость передать для каждого вызова ряд затронутых элементов и функции, описывая, как элемент должен вести себя к функции высшего порядка, которая гарантирует весь материал синхронизации, его обычно легче для клиента выпустить, как общедоступный API некоторая функция как "slideUp", "постепенное появление", которое берет только элементы в качестве аргументов, и которое является просто некоторой функцией с приправой карри, возвращая высокого уровня функцию со встроенной "функцией анимации" по умолчанию.
Реализация Ruby Kernel # caller
выполнена с String
для повышения производительности и сборки мусора. Если вы хотите провести более сложный анализ стека вызовов, взгляните на это сообщение в блоге:
http://eigenclass.org/hiki/ruby+backtrace+data
Автор рассматривает две различные реализации лучшего граф объектов стека вызовов, один из которых реализован на чистом Ruby с (малоизвестным) методом Kernel # set_trace_func
, а другой работает как расширение C для MRI.
Производственное приложение не должно использовать ничего другого чем реализация Kernel # caller
, поставляемая с Ruby. Если вы широко используете указанные выше расширения, вы
Вы можете написать что-то вроде этого:
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>
Исследование стека вызовов Ruby содержит следующую информацию:
Хотели ли вы когда-нибудь просмотреть стек вызовов, не создавая исключения для этого?
caller.each {|c| puts c}
Обратите внимание, что ваша копия стандарта устарела и содержит известную (и исправленную) ошибку только в 1-й и 3-й строках кода вашего примера, см.: