2013-07-16 6 views
8

PHP Esempio:Ruby supporta l'hint di tipo?

function do_something(int $i) { 
    return $i + 2; 
} 

Rubino Esempio:

class MyClass 
    # ... 
end 

def do_something(MyClass x) 
    x.prop1 = "String..." 
end 

C'è qualcosa di simile a questo? Grazie.

+2

nota che php supporta typehinting solo per gli array e gli oggetti. '(int $ i)' non è purtroppo possibile. A proposito, perché i downvotes qui? Per me, come PHP-dev, questo è interessante – hek2mgl

+0

Scusa cosa? PHP non supporta il tipo di ridimensionamento scalare senza estensioni di terze parti – Hast

+1

@Hast purtroppo non – hek2mgl

risposta

3

Rubino non ha Tale cosa, ma tutto quello che dovete fare è aggiungere una riga in questo modo:

def do_something(x) 
    raise "Argument error blah blah" unless x.kind_of?(MyClass) 
    ... 
end 

Non è un grosso problema. Ma se si sente che è troppo prolisso, poi basta definire un metodo:

module Kernel 
    def verify klass, arg 
    raise "Argument error blah blah" unless arg.kind_of?(klass) 
    end 
end 

e mettere che nella prima riga:

def do_something(x) 
    verify(MyClass, x) 
    ... 
end 
+1

Per documentazione come yard, rdoc, esiste una sintassi speciale per specificare la classe degli argomenti. – sawa

+6

è divertente "tutto ciò che devi fare è scrivere un'eccezione personalizzata per ogni parametro su ogni chiamata di funzione" Dovevo davvero ridere :). Non sapevo che il rubino sia pura spazzatura fino a quando non ho scoperto che non c'è nessun tipo di suggerimento. Ora non mi dilungherò con quella lingua di sicuro – Toskan

+4

A parte le preoccupazioni estetiche, questo non è semanticamente equivalente al tipo di suggerimento. Fondamentalmente, questo è _runtime_ checking, rispetto al tipo hinting, che consente il _static_ checking. Cioè Posso controllare tutti i percorsi di codice immediatamente, senza doverli eseguire. Non sto cercando di spazzare Ruby, solo sottolineando che i controlli del tipo di runtime non sono equivalenti. Questo è equivalente solo con la copertura completa del test (oltre la semplice "copertura del 100%": deve testare ogni codepath, che è molto più che colpire ogni linea sintattica). Questo è ... un "grosso problema": P – hraban

3

Se davvero si vuole fare in modo una certa azione viene eseguita su un'istanza di una classe specifica (come un intero), quindi prendere in considerazione la definizione che l'azione sulla classe specifica:

class Integer 
    def two_more 
    self + 2 
    end 
end 

3.two_more #=> 5 
2.0.two_more #=> undefined method `two_more' for 2.0:Float (NoMethodError) 

class MyClass 
    def do_something 
    self.prop1 = "String..." 
    end 
end 
+2

Che funziona solo per * un * "parametro" (il ricevitore), a causa della singola spedizione .. – user2246674

1

No, Ruby per sé non lo supporta, e credo che questo non è l'intenzione di Matz di aggiungerlo al linguaggio ... Ruby abbraccia davvero lo duck typing nella propria API interna e rende Ruby un linguaggio molto dinamico e produttivo ...

+9

Questo va tutto bene fino a quando non si arriva a sistemi complessi e tali argomenti devono corrispondere a una certa implementazione. Ruby, per quanto sia un linguaggio così grande, potrebbe davvero fare con questa caratteristica. È una grande caratteristica di alcuni dei migliori linguaggi OO :) – Oddman

2

Plug senzatetto - Ho appena pubblicato un gemma rubino per questo - http://rubygems.org/gems/type_hinting

L'uso è qui - https://github.com/beezee/ruby_type_hinting

Sono andato a cercarlo prima e ho trovato questo thread. Non ho trovato quello che stavo cercando così l'ho scritto e ho pensato di condividere qui.

Penso che sia più conciso di qualsiasi delle soluzioni proposte qui e consente anche di specificare il tipo di ritorno per un metodo.

Problemi correlati