2009-02-14 20 views
17

Làm thế nào để bạn viết mô-đun cho ruby. trong python bạn có thể sử dụngViết mô-đun cho Ruby

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

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

Quay lại Câu hỏi làm thế nào để bạn tạo một module vào/cho ruby ​​

Trả lời

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 
+6

Có thể bạn sẽ muốn sử dụng "def self.random" để tránh các sự cố khi tên mô-đun của bạn thay đổi. Đây là thông lệ của Ruby. – molf

29

Modules trong Ruby có mục đích khác với module trong Python . Thông thường, bạn sử dụng các mô-đun để xác định các phương thức phổ biến có thể được bao gồm trong định nghĩa lớp khác.

Nhưng các mô-đun trong Ruby cũng có thể được sử dụng theo cách tương tự như trong Python chỉ để nhóm các phương thức trong một số không gian tên. Vì vậy, ví dụ bạn trong Ruby sẽ là (tôi đặt tên cho mô-đun như Module1 như module là tiêu chuẩn của Ruby không đổi):

# module1.rb 
module Module1 
    def self.helloworld(name) 
    puts "Hello, #{name}" 
    end 
end 

# main.rb 
require "./module1" 
Module1.helloworld("Jim") 

Nhưng nếu bạn muốn hiểu những điều cơ bản của Ruby Tôi muốn giới thiệu để bắt đầu với một số quick guide to Ruby - StackOverflow không phải là cách tốt nhất để tìm hiểu kiến ​​thức cơ bản về ngôn ngữ lập trình mới :)

EDIT
Vì 1,9 đường dẫn cục bộ không còn trong $ SEARCH_PATH nữa. Để requrie một tập tin từ thư mục địa phương của bạn, bạn có cần require ./FILE hoặc require_relative FILE

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 

Trong ruby, mô-đun là tên cho cấu trúc syntatic sử dụng các phương pháp nhóm, hằng, các lớp học, và các module khác. Chúng tương đương với không gian tên của Ruby.

Một khái niệm riêng biệt được nhóm theo tệp, như ở trên. Tuy nhiên, thông thường, hai khái niệm cùng tồn tại, với một tệp sử dụng một mô-đun duy nhất làm không gian tên của nó.

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

dân đã đưa ra một số ví dụ tốt đẹp ở đây nhưng bạn có thể tạo và các module sử dụng theo cách sau đây cũng (Mixins)

Module để được bao gồm

#instance_methods.rb 
module MyInstanceMethods 
    def foo 
    puts 'instance method foo called' 
    end 
end 

Module để được mở rộng

#class_methods.rb 
module MyClassMethods 
    def bar 
    puts 'class method bar called' 
    end 
end 

Bao gồm phương pháp mô-đun hành động như thể chúng là phương pháp thể hiện của lớp, trong đó các mô-đun được bao gồm

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. 

Extended phương pháp mô-đun hành động như thể chúng là phương pháp lớp học của lớp, trong đó các mô-đun được bao gồm

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 

Bạn thậm chí có thể mở rộng mô-đun chỉ cho một đối tượng cụ thể của lớp học.Vì mục đích đó thay vì mở rộng các mô-đun bên trong lớp, bạn làm điều gì đó như

my_obj.extend MyClassMethods 

Bằng cách này, chỉ có my_object sẽ có quyền truy cập vào MyClassMethods phương pháp mô-đun và không trường hợp khác của lớp mà my_object thuộc. Các mô đun rất mạnh mẽ. Bạn có thể tìm hiểu quặng về chúng bằng cách sử dụng core API documentation

Xin lỗi nếu có bất kỳ sai lầm ngớ ngẩn nào trong mã, tôi đã không thử nhưng tôi hy vọng bạn sẽ có ý tưởng.

Các vấn đề liên quan