Что предотвращает статически набранный язык иметь что-то вроде метода Ruby_Missing?
-
05-10-2019 - |
Вопрос
У меня нет большого опыта работы с статически напечатанными языками (в настоящее время изучают Scala и любить его!) Но одна вещь, которую я заметил, так это то, что у них никогда не будет ничего, как метод Ruby_Missing или OnmissingMethod. Есть ли некоторое присущее ограничение в статически набранных языках, которые предотвращают или делают это сложным?
Решение
Конечно, механизм для обработки их может быть добавлен, но оно находится в шансах с каким статическим набором: определение времени компиляции, которое ваша программа не имеет ошибок типа.
Приложение
Scala 2.9 ввел экспериментальный вариант, позволяющий такого рода динамическое обращение с доступами к типам способах, которые в противном случае в противном случае не провалится проверка статического типа. Он был изыскан и сделал неэкспериментальный в 2.10, хотя он все еще контролируется флагом отключения по умолчанию. Вы можете прочитать об этом в SIP 17. документ. Видеть SIP 18. Для объяснения Scala 2.10 «Модуляризация» и Флаги функций.
Другие советы
Scala версия 2.9 вводит эту функциональность через Dynamic
черта (Scaladoc.). Классы, которые простираются Dynamic
Получить магический метод applyDynamic(methodName, args)
, что аналогично рубиному method_missing
. Отказ Как в Scala 2.9, -Xexperimental
Опция должна быть включена для использования Dynamic
.
В статически набираемых языках функции членов вызываются напрямую. Если компилятор не может выяснить, какая функция члена для вызова программа не скомпирована. Вызов метода в этом смысле статическое.
На динамически набираемых языках функции членов не вызываются напрямую. Скорее, вызывающий код отправляет сообщение на объект, а затем текущий момент времени выполнения выясняет, что делать с этим сообщением. Например, время выполнения будет отсканировать объект для метода с тем же именем, а затем сканирует объект для метода с именем method_missing
. Отказ Вызов метода в этом смысле динамический.
C # 4 сочетает в себе статический набрав с динамическими наборами. Переменная может иметь тип компиляции dynamic
. Отказ Любые вызовы метода в этой переменной будут обрабатываться как в динамически набираемых языках. Любой метод вызовов на переменные со статическими типами будет обрабатываться как на статически набранных языках.
# static invocation, bound at compile time by the compiler
var s = 6;
s.ToString();
# dynamic invocation, handled at runtime by the CLR
dynamic d = 6;
d.ToString();
Просто к дальнейшему посту Randall, можно, но причина, по которой она идет против статической парадигмы, заключается в том, что она находится за пределами «динамической рассылки». Динамическая отправка счастливо позволяет отправлять функции, которая динамически связана с известным статическим кусочком кода. Т.е. компилятор устанавливает отправку, который определяется, выполняемый во время выполнения, с его точки зрения.
Что за method_missing
Вызов, по сути, по сути делает «все», где вы решаете, что делать на основе имени метода с использованием оператора коммутатора или что-то эквивалентное (которое, я уверен, вы знаете). Таким образом, компилятор не имеет представления, что здесь произойдет. Допустим, компилятор сделал что-то вроде:
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 ++.
Objective-C имеет «method_missing» (конкретно, fortvinvocation. а также Методовые компонентыФорЗертектор) И это, возможно, статически набирается. Это работает, потому что он будет лечить ошибки статического типа в качестве предупреждений, а не ошибок в компиляционном времени, поскольку рассылка метода возникает во время выполнения до гораздо большей степени, чем что-то вроде виртуальных методов в C ++ (и именно поэтому вы можете иметь «method_missing»).