Просто для дальнейшего поста Рэндалла, это возможно, но причина, по которой он идет вразрез со статической парадигмой, заключается в том, что она выходит за рамки «динамической отправки». Динамическая диспетчеризация позволяет вам отправлять функции, которые динамически связаны с известным статическим фрагментом кода. то есть компилятор устанавливает диспетчеризацию, которая детерминированно выполняется во время выполнения с ее точки зрения.
То, что делает вызов method_missing
, по сути, делает «catch all», где вы решаете, что делать, основываясь на имени метода, используя оператор switch, или что-то эквивалентное (что, я уверен, вы знаете). Таким образом, компилятор понятия не имеет, что здесь произойдет. Допустим, компилятор сделал что-то вроде:
if (function is known at compile time)
{
provide static call or dynamic call to "some" derivation
}
else
{
bind the function call to obj.method_missing(...) and pass in the "details"
}
Тогда вы должны предоставить method_missing
, например:
def method_missing(intendedFunctionName, arguments)
{
if (intendedFunctionName is "X")
{
X may not need arguments, so just do something
}
else if (intendedFunctionName is "Y")
{
Y expects 5 arguments of varying types
Throw exception if there isn't the right number or types
}
... etc ...
}
Просьба к компилятору отправить вам «произвольные» (то есть неизвестные во время компиляции) аргументы произвольных типов с intendedFunctionName
, который вы, возможно, не учитываете… ну, это не очень безопасно, и Scala предназначен для статически безопасного языка.
Да, это выполнимо, но не в духе статичного языка. Если вы действительно хотите такой гибкости, программирование полиглота, вероятно, ваш друг.
Примечание: Objective-C не является строго статически типизированным. Существует механизм времени исполнения, на котором выполняется код, а система динамической типизации не позволяет разбирать или вставлять код, как в C / C ++.