Pregunta

No tengo mucha experiencia con los lenguajes de tipos estáticos (actualmente aprendizaje Scala y amándolo!), Pero una cosa que he notado es que no siempre parecen tener algo como method_missing de Ruby o onMissingMethod de ColdFusion. ¿Hay alguna limitación inherente a las lenguas tipos estáticos que impiden o dificultan esta actividad?

¿Fue útil?

Solución

Sin duda un mecanismo para el manejo de ellos se podría añadir, pero está en desacuerdo con lo que los tipos estáticos es:. Determinación en tiempo de compilación que su programa está libre de errores de tipo

Adición

Scala 2.9 introdujo una opción experimental que permite este tipo de manejo dinámico de los accesos a los tipos de formas que de otro modo no comprobación de tipo estático. Se refina e hizo no experimental en 2,10, aunque todavía es controlado por un indicador de la función por defecto-disable. Usted puede leer sobre él en el href="http://docs.scala-lang.org/sips/pending/type-dynamic.html" rel="nofollow"> SIP documento 17 SIP 18 para una explicación de Scala 2.10 de "modularización" y señalizadores de característica.

Otros consejos

versión Scala 2.9 introduce esta funcionalidad a través de la (Dynamic rasgo = "http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/Dynamic.html "rel =" nofollow "> scaladoc ). Las clases que se extienden Dynamic obtener la mágica applyDynamic(methodName, args) método, que es análoga a method_missing de Ruby. A partir de Scala 2.9, la opción -Xexperimental debe estar habilitado para el uso Dynamic.

En los lenguajes de tipos estáticos, funciones miembro se invoca directamente. Si el compilador no puede averiguar qué función miembro para invocar, el programa no compilará. Método de invocación es, en este sentido, estática.

En los lenguajes de tipado dinámico, funciones miembro son no invoca directamente. Por el contrario, código de llamada envía un mensaje a un objeto, y luego el tiempo de ejecución de lenguaje se da cuenta de qué hacer con ese mensaje. Por ejemplo, el tiempo de ejecución escaneará el objeto para un método con el mismo nombre, y luego va a escanear el objeto de un método con el nombre method_missing. Método de invocación es, en este sentido, dinámico.

C # 4 combina tipos estáticos con tipado dinámico. Una variable puede tener un tipo de tiempo de compilación de dynamic. Cualquier invocaciones de métodos en esta variable serán manejadas como en lenguajes de tipado dinámico. Cualquier invocaciones de métodos de variables con tipos estáticos serán manejadas como en lenguas tipos estáticos.

# 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();

Sólo al puesto más de Randall, es posible, pero la razón por la que va en contra del paradigma estático es que es más allá de "envío dinámico". Dinámica de despacho felizmente le permite despacha a una función que se enlaza dinámicamente a una pieza estática conocida del código. es decir, los conjuntos de compilador hasta el envío que se ejecuta de manera determinista en tiempo de ejecución, desde su punto de vista.

Lo que hace la llamada method_missing, es esencialmente hacer un "todo" ni donde se decide qué hacer basado en el nombre del método utilizando una sentencia switch, o algo equivalente (que estoy seguro de que sabes). Por lo tanto, el compilador no tiene idea de lo que va a ocurrir aquí. Digamos que el compilador hizo algo como:

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"
}

A continuación, usted tiene que proporcionar method_missing como esto:

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 ...
}

Preguntar al compilador para que le envíe "arbitrarias" (es decir, no se conoce en tiempo de compilación) argumentos de tipos arbitrarios, con un intendedFunctionName que usted puede no estar de contabilidad para ... bueno, no es muy seguro, y está destinado a Scala ser un lenguaje estáticamente segura.

Sí, es factible, pero no en el espíritu de un lenguaje estático. Si realmente quiere ese tipo de flexibilidad, programación políglota es probablemente su amigo.

Nota: Objective-C no es estrictamente mecanografiado estáticamente. Hay un motor de tiempo de ejecución en el que se ejecuta el código y el sistema dinámico de mecanografía no permite código para ser despojado o inline como C / C ++.

Objetivo-C tiene "method_missing" (específicamente, forwardInvocation y methodSignatureForSelector ) y es posiblemente tipos estáticos. Esto funciona porque va a tratar errores de tipo estático como advertencias en lugar de errores en tiempo de compilación, ya que el método de envío se produce en tiempo de ejecución en mayor cantidad que algo así como métodos virtuales en C ++ (y esto es por lo que puede tener "method_missing").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top