Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Модули в 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

Ответ 2

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

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

Ответ 3

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 

Ответ 4

# 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