¿Este código es válido? https://ethereum.stackexchange.com/a/8484/10138 ¡Simplemente no veo cómo Mortal (mortal), una instanciación del contrato Mortal con un parámetro, es posible cuando Mortal no toma parámetros !
Puedo ver por qué estás confundido. La clave que debe saber aquí es que se typename(X)
ve igual functionname(parametername)
pero en realidad es una operación totalmente diferente con la que puede estar familiarizado, lanzar .
Para aquellos que no lo saben, la conversión se trata de cambiar el tipo de una variable, generalmente de un tipo más simple a un tipo más complejo que normalmente se hereda de ella. Por ejemplo, es posible que desee convertir un uint32 al tipo uint64, más grande pero aún compatible. Para hacer eso, antecede el nombre de la variable que desea convertir con el nombre del tipo al que desea convertirlo, y luego lo rodea con paréntesis como este:
uint64(mycurrentvariablewhichisauint32)
En el caso de su pregunta, estamos analizando específicamente una característica menos conocida del lenguaje Solidity: todos los contratos se heredan del tipo "dirección" y, por lo tanto, los tipos de dirección se pueden convertir en tipos de contrato .
Dada esta información, es fácil ver lo que sucede en el fragmento de código al que hace referencia. Como señala Badr, el fragmento asume que la dirección confusamente denominada "mortal" es la dirección de una copia ya instanciada de un contrato de tipo mortal (o técnicamente compatible con la interfaz mortal, ya que no tiene que ser exactamente mortal). solo tiene que incluir las firmas de función que incluye mortal, generalmente porque heredó de él). Sin embargo, para llamar realmente a una de las funciones mortales, debe decirle a la solidez que esta dirección en particular es un contrato de tipo mortal. Lo haces enviando la dirección al tipo mortal:
Mortal(theaddressofthecontractwhichisactuallyamortaltypecontract)
Esta no es una llamada al constructor de Mortal, que parecería new Mortal()
y generaría su propia dirección nueva desde cero. ¿Tener sentido?
te refieres a este fragmento de código:
function checkMortal(address mortal) {
if (Mortal(mortal).owner() == 0) {
// You know it is dead.
} else {
// You know it is alive.
}
}
el Mortal(mortal) en este caso es una instanciación del contrato Mortal, es similar a
function checkMortal(address mortal) {
Mortal M=Mortal(mortal);
if (M.owner() == 0) {
// You know it is dead.
} else {
// You know it is alive.
}
}
Mortal M=Mortal()
que es válido, pero no Mortal M=Mortal(someParameter)
.Contract(Address)
)?Mortal(passedInAddress)
simplemente convierte el tipo de dirección en un tipo "Mortal" para que se pueda llamar a una de sus funciones. Ahora que lo escribí, creo que probablemente merece una respuesta completamente separada, así que escribiré una.
Jossie Calderón
mortal
: ¿algo así como unObject
toString
(en Java)?jeff coleman
david callanan