2009-02-14 13 views
17

Come si scrive un modulo per rubino. in Python è possibile utilizzareModulo di scrittura per Ruby

# module.py 
def helloworld(name): 
    print "Hello, %s" % name 

# main.py 
import module 
module.helloworld("Jim") 

Torna alla domanda come si fa a creare un modulo in/per ruby ​​

risposta

0
module NumberStuff 
    def self.random 
    rand(1000000) 
    end 
end 

module LetterStuff 
    def self.random 
    (rand(26) + 65).chr 
    end 
end 

puts NumberStuff.random 
puts LetterStuff.random 

184783 
X 
+6

Probabilmente vorrai usare "def self.random" per evitare problemi quando il nome del modulo cambia. Questa è una pratica comune di Ruby. – molf

29

moduli in Ruby hanno scopo diverso rispetto ai moduli in Python . In genere si utilizzano i moduli per definire metodi comuni che potrebbero essere inclusi in altre definizioni di classe.

Ma i moduli in Ruby potrebbero anche essere utilizzati in modo simile a in Python solo per raggruppare metodi in alcuni namespace. Quindi, il tuo esempio in Ruby sarebbe (I nome del modulo come Module1 come modulo è costante standard di Ruby):

# module1.rb 
module Module1 
    def self.helloworld(name) 
    puts "Hello, #{name}" 
    end 
end 

# main.rb 
require "./module1" 
Module1.helloworld("Jim") 

Ma se si vuole comprendere le basi di Rubino consiglierei di iniziare con qualche quick guide to Ruby - StackOverflow non è il modo migliore come imparare basi della nuovo linguaggio di programmazione :)

EDIT
Dal 1.9 il percorso locale non è in $ search_path più. Per requrie un file dalla cartella locale vi sia bisogno require ./FILE o require_relative FILE

0
# meth.rb 
def rat 
    "rizzo" 
end 

# cla.rb 
class Candy 
    def melt 
    "awwwww...." 
    end 
end 

# main.rb 
require 'meth' 
require 'cla' 
require 'mod' 

puts rat 
puts Candy.new.melt 
puts Hairy.shave 

In rubino, i moduli sono il nome per costrutti syntatic utilizzati per i metodi di gruppo, costanti, classi e altri moduli. Sono l'equivalente di ruby ​​dei namespace.

Un concetto separato raggruppa per file, come sopra. Spesso, tuttavia, i due concetti coesistono, con un file che utilizza un singolo modulo come spazio dei nomi.

# mod.rb 
module Hairy 
    def self.shave 
    "ouch!" 
    end 
end 
16

persone hanno dato alcuni esempi bello qui, ma è possibile creare e moduli di uso nel seguente modo così (Mixins)

modulo da inclusi

#instance_methods.rb 
module MyInstanceMethods 
    def foo 
    puts 'instance method foo called' 
    end 
end 

Modulo di essere esteso

#class_methods.rb 
module MyClassMethods 
    def bar 
    puts 'class method bar called' 
    end 
end 

Incluso metodi modulo agire come se fossero metodi della classe in cui il modulo è incluso

require 'instance_methods.rb' 

class MyClass 
    include MyInstanceMethods 
end 

my_obj = MyClass.new 
my_obj.foo #prints instance method foo called 
MyClass.foo #Results into error as method is an instance method, _not_ a class method. 

estese metodi del modulo di istanza si comportano come se fossero metodi di classe della classe in cui il modulo è incluso

require 'class_methods.rb' 

class MyClass 
    extend MyClassMethods 
end 

my_obj = MyClass.new 
my_obj.bar #Results into error as method is a class method, _not_ an instance method. 
MyClass.bar #prints class method bar called 

È anche possibile estendere un modulo solo per uno specifico oggetto di classe.A tal fine, invece di estendere il modulo all'interno della classe, fai qualcosa come

my_obj.extend MyClassMethods 

questo modo, solo il my_object avranno accesso a MyClassMethods metodi modulo e non altre istanze della classe a cui appartiene my_object. I moduli sono molto potenti. Puoi imparare su di loro usando core API documentation

Per favore scusami se ci sono degli errori stupidi nel codice, non l'ho provato ma spero che tu abbia capito l'idea.

Problemi correlati