你如何为ruby编写模块。 在python中你可以使用
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
返回问题如何在/为ruby
创建模块答案 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 ./FILE
或require_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