0%

Ruby on Rails學習筆記-Module

有時有多個類別都需要使用同個方法,這時候可以定義一個模組,讓每個類別可以引入取用。

模組與繼承的不同之處:

  • 模組沒有繼承的功能:
1
2
3
4
module Flyable < other module
end

#無法繼承
  • 模組不能被實體化:
1
2
3
4
5
6
module Flyable
end

Dog = Flyable.new

#undefined method `new' for Flyable:Module (NoMethodErro

模組引入有兩種寫法:

  1. 在類別內include模組,此類別製造的實體可使用模組的方法(實體方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module Invisible
def woolala
puts "nobody can see #{@name} now!"
end
end

class Human
include Invisible
def initialize(name)
@name = name
end
end

Phil = Human.new("Phil")
Phil.woolala

#印出 nobody can see Phil now!
  1. 在類別內extend模組,此類別可直接使用方法(類別方法),但其製造的實體不可使用此方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module Flyable
def fly
puts 'I can Fly!'
end
end

class Cat
extend Flyable
end

Cat.fly
#印出 I can Fly!

Phil = Cat.new
Phil.fly
#undefined method `fly' for #<Cat:0x0000563c17581b38> (NoMethodError)

如有重複的類別名稱,可用不同模組區隔,製作實體時,需用” :: “來鎖定欲呼叫的類別。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module A
module Z
class Dog
end
end
end

module B
class Dog
end
end

Ryan = A::Z::Dog.new #必須一層層呼叫到類別
Will = B::Dog.new

冒號的位置在Ruby代表不同意思

  • 冒號在左邊,代表符號
1
has_name :name
  • 冒號在右邊,代表hash裡面的key
1
{name: "Phil", age: 32}
  • 冒號在中間,前者是key,後者是符號,中間用空格隔開
1
{direction: :up, power: 100}
  • 冒號在中間,而且沒有空格,代表呼叫模組裡面的類別
1
2
class User < ActiveRecord::Base #User繼承ActiveRecord模組裡面的Base類別
end