2009-02-14 2 views
17

Как вы пишете модуль для ruby. в Python вы можете использоватьПисьменный модуль для Ruby

# 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», чтобы избежать проблем при изменении имени вашего модуля. Это обычная рубиновая практика. – molf

29

модулей в Ruby, имеют разные цели, чем модули в Python , Обычно вы используете модули для определения общих методов, которые могут быть включены в определение другого класса.

Но модули в Ruby также могут использоваться так же, как в Python, только для группировки методов в некотором пространстве имен. Так что ваш пример в Рубине будет (я имя модуля Module1, как модуль является стандартным постоянная 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 не лучший способ, как научиться основам нового языка программирования :)

EDIT
Поскольку 1.9 локальный путь не в $ search_path больше. Чтобы requrie файла из локальной папки, необходим либо require ./FILE или 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 

В рубине, модули имя для облегченной записи конструкций, используемых для групповых методов, констант, классов и других модулей. Они эквивалент пространства имен 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 

модуль будет extended

#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

Прошу прощения, если в коде есть какие-то глупые ошибки, я не пробовал, но надеюсь, что у вас есть идея.

Смежные вопросы