Как вы пишете модуль для ruby. в python вы можете использовать
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
Вернуться к вопросу о том, как создать модуль в/для ruby
Как вы пишете модуль для ruby. в python вы можете использовать
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
Вернуться к вопросу о том, как создать модуль в/для ruby
Модули в Ruby имеют разные цели, чем модули в Python. Обычно вы используете модули для определения общих методов, которые могут быть включены в определение другого класса.
Но модули в Ruby также могут использоваться так же, как в Python, только для группировки методов в каком-либо пространстве имен. Таким образом, ваш пример в Ruby будет (я называю модуль Module1 как Module стандартной константой Ruby):
# module1.rb
module Module1
def self.helloworld(name)
puts "Hello, #{name}"
end
end
# main.rb
require "./module1"
Module1.helloworld("Jim")
Но если вы хотите понять основы Ruby, я бы посоветовал начать с некоторого краткого руководства по Ruby - StackOverflow не самый лучший способ как узнать основы нового языка программирования:)
ИЗМЕНИТЬ
Начиная с 1.9, локальный путь больше не находится в $SEARCH_PATH. Чтобы запросить файл из вашей локальной папки, вам понадобится require ./FILE
или require_relative FILE
Люди дали несколько хороших примеров, но вы можете создавать и использовать модули следующим образом (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. Модули очень мощные. Вы можете изучить руду о них с помощью документации по базовому API
Пожалуйста, извините, если в коде есть глупые ошибки, я не пробовал, но надеюсь, вы поняли.
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
# 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