Что предотвращает статически набранный язык иметь что-то вроде метода Ruby_Missing?

StackOverflow https://stackoverflow.com/questions/3788550

Вопрос

У меня нет большого опыта работы с статически напечатанными языками (в настоящее время изучают 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»).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top