为Ruby编写模块

时间:2009-02-14 08:36:53

标签: ruby

你如何为ruby编写模块。 在python中你可以使用

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

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

返回问题如何在/为ruby

创建模块

4 个答案:

答案 0 :(得分:31)

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的基础知识我会建议从一些quick guide to Ruby开始 - StackOverflow不是学习新编程语言基础知识的最佳方法:)

修改
从1.9开始,本地路径不再是$ SEARCH_PATH。要从您的本地文件夹中获取文件,您需要require ./FILErequire_relative FILE

答案 1 :(得分: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

了解有关它们的相关信息

请原谅代码中是否有任何愚蠢的错误,我没试过,但我希望你明白这一点。

答案 2 :(得分: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 

答案 3 :(得分: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中,模块是用于对方法,常量,类和其他模块进行分组的合成构造的名称。它们是ruby相当于命名空间。

一个单独的概念是按文件分组,如上所述。但是,这两个概念通常共存,一个文件使用单个模块作为其命名空间。

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