A quanto ho capito, un'interfaccia è Java ha lo scopo di imporre un progetto estendendo i metodi per le classi che implementano l'interfaccia da compilare. È questa l'idea anche con un modulo Ruby? Vedo che, proprio come con Interfaces in Java, non è possibile creare un'istanza di un modulo in Ruby.È un modulo Ruby equivalente a un'interfaccia Java?
risposta
Penso che equiparerei un modulo a qualcosa di più simile a un metodo di estensione in C#. Stai aggiungendo funzionalità a una classe esistente che è effettivamente definita altrove. Non esiste un analogo esatto né in C# né in Java, ma sicuramente non lo considererei un'interfaccia perché l'implementazione è derivata così come l'interfaccia.
No. Un modulo in rubino è più simile a una classe statica. Non sono uno sviluppatore Java, ma sono indovinando che le interfacce Java sono simili alle interfacce C#, cioè definiscono un contratto, ma non un'implementazione.
Non dovrei, mentre ho esperienza nel ruby, è nella creazione di videogiochi (RGSS/2). Sono sicuro di non conoscere molte cose che un veterano programmatore di rubini avrebbe saputo.
quindi se un '' ruby' 'è come una' static' '' Java', allora un 'ruby'' module' come un 'C#' 'namespace'? – mmcrae
Un modulo in ruby è un po 'di ambito/spazio dei nomi che può essere aggiunto ad altre cose. Vengono utilizzati per due scopi distinti ma correlati: raggruppare un gruppo di cose correlate (costanti, classi, ecc.) Che appartengono insieme e quindi aggiungerle in qualche altro ambito (come l'ereditarietà multipla).
Ad esempio, ci sono moduli chiamati cose come Comparable ed Enumerable e così via che racchiudono la funzionalità che ci si aspetterebbe che qualcosa avesse se questi aggettivi fossero applicati. Fornendo una definizione di base (un metodo che confronta due istanze per Comparable e un iteratore per Enumerable) è possibile importare il modulo e ritrovarsi con l'interfaccia completa.
D'altra parte ci sono moduli come Net che raramente includeresti in una classe ma che forniscono un insieme di funzionalità come Net :: HTTP, Net :: FTP, Net :: SMTP e così via.
Nel mezzo ci sono cose come Math e Process che potrebbero essere usate in un modo o nell'altro.
- MarkusQ
La risposta breve è no.
Ecco il ragionamento, un'interfaccia Java/C# definisce le firme del metodo che una classe di implementazione fornirà al minimo.
Inoltre:
- Con i moduli rubino non esiste tale contratto a causa della anatra tipizzazione.
- I moduli sono solo un modo per estrarre funzionalità comuni per un facile riutilizzo. La relazione più vicina è i metodi di estensione C#, ma quelli non sono una corrispondenza esatta poiché esistono in un contesto statico.
- I moduli possono aggiungere lo stato a una classe esistente.
- moduli possono avere metodi statici
- moduli possono agire come namespace
Esempio:
module SimpleConversation
class NamespacedExample
def poke
puts "ouch"
end
end
attr_accessor :partner_name
def converse
partner_name ||= "Slowpoke"
speak + "\n#{partner_name}: Yes they are"
end
def self.yay
puts "yay"
end
end
class Foo
include SimpleConversation
attr_accessor :name
def speak
name ||= "Speedy"
"#{name}: tacos are yummy"
end
end
x = Foo.new
x.name = "Joe"
x.partner_name = "Max"
puts x.speak
puts x.converse
y = SimpleConversation::NamespacedExample.new
y.poke
SimpleConversation.yay
Dal punto di vista formale moduli in rubino attuare disegno modello chiamato "mixin". http://en.wikipedia.org/wiki/Mixin
Può essere paragonato ai tratti di PHP. http://php.net/manual/en/language.oop5.traits.php
Tale architettura è utile in lingue che non consentono l'ereditarietà multipla, ad es. Ruby, PHP.
Per il mio beneficio qui, ho sbagliato nella mia valutazione? È così che li ho usati fino ad ora, forse mi sto perdendo qualcosa. –
È possibile includere un modulo in una classe Ruby ed ereditare il suo comportamento, almeno i metodi di istanza. Dai un'occhiata a http://www.ruby-doc.org/core/classes/Module.html – tvanfosson
È vero, lo sapevo, lo uso solo raramente in rpg maker. Grazie, vedo il punto ora. –