2009-02-14 191 views
17

如何爲紅寶石書寫模塊? 在Python中你可以使用紅寶石書寫模塊

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

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

回到剛纔的問題,你如何創建/模塊的紅寶石

回答

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

您可能會想要使用「def self.random」以避免模塊名稱更改時出現問題。這是常見的Ruby練習。 – molf 2009-06-26 19:16:17

29

模塊在Ruby中有不同的目的在Python模塊。通常,您可以使用模塊來定義可以包含在其他類定義中的常用方法。

但是Ruby中的模塊也可以像在Python中一樣使用,只是爲了在某些名稱空間中分組方法。所以,在Ruby中的例子是(我的名字模塊爲模塊的模塊是標準的Ruby常數):

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

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

但是,如果你想了解的Ruby的基礎知識,我建議先從一些quick guide to Ruby - StackOverflow上不如何學習新的編程語言:)

編輯
基礎由於1.9的本地路徑的最好辦法是不是在$ SEARCH_PATH了。要從本地文件夾requrie一個文件,你要麼需要require ./FILErequire_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 

在Ruby中,模塊是用於分組的方法,常量,類和其他模塊syntatic結構的名稱。它們是Ruby的命名空間。

一個單獨的概念正在按文件分組,如上所述。然而,這兩個概念常常共存,一個文件使用單個模塊作爲其名稱空間。

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

人們在這裏給出了一些很好的例子,但你可以通過以下方式創建和使用的模塊,以及(Mixins

模塊是包括

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

模塊是擴展

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

包括模塊的方法表現得好像它們是,其中該模塊被包括

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. 

擴展模塊的方法的類的實例方法表現得好像它們是類的類中的方法,其中該模塊包括在內

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 

你甚至可以擴展一個模塊,只爲一個特定的類的對象。爲了這個目的,而不是模塊擴展類裏面,你這樣做

my_obj.extend MyClassMethods 

這樣,只有my_object將有機會獲得MyClassMethods模塊方法和my_object所屬的類的不是其他實例。模塊非常強大。您可以使用core API documentation

請原諒,如果在代碼中有任何愚蠢的錯誤,我沒有嘗試它,但我希望你明白了。