Написание модуля для Ruby - PullRequest
       13

Написание модуля для Ruby

19 голосов
/ 14 февраля 2009

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

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

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

Вернуться к вопросу, как создать модуль в / для ruby ​​

Ответы [ 4 ]

31 голосов
/ 14 февраля 2009

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

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

EDIT
С версии 1.9 локальный путь больше не находится в $ SEARCH_PATH. Чтобы запросить файл из вашей локальной папки, вам нужно либо require ./FILE, либо require_relative FILE

16 голосов
/ 14 февраля 2009

Люди привели здесь несколько хороших примеров, но вы также можете создавать и использовать модули следующим образом ( 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

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

0 голосов
/ 14 февраля 2009
# 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
0 голосов
/ 14 февраля 2009
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...