首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Ruby require、load、include、extend 四大關鍵字差異完整解析

     編輯:更多程式設計知識

檔案載入:require vs load

特性requireload
載入次數只載入一次(快取 $LOADED_FEATURES)每次呼叫都重新載入
副檔名可省略 .rb必須完整檔名
適用場景函式庫、Gem、不常變動的程式碼設定檔、開發中頻繁修改的檔案
回傳值首次載入 true,重複 false總是 true

# require 'library'        # 載入 library.rb (一次)
# load 'config.rb'         # 每次都重新載入 config.rb

模組混入:include vs extend

特性includeextend
方法變成實例方法類別方法(單例方法)
呼叫方式obj.methodClass.method
變數共享模組實例變數在各實例間獨立模組實例變數在類別層級共享
查找鏈插入類別的祖先鏈插入類別的單例類別祖先鏈

include 範例:實例方法


module Greeting
  def hello
    "Hello, #{self.class}!"
  end
end

class Person
  include Greeting
end

Person.new.hello  # => "Hello, Person!"

extend 範例:類別方法


module ClassInfo
  def description
    "This is #{self}"
  end
end

class User
  extend ClassInfo
end

User.description  # => "This is User"

進階:include 不會複製方法


module M
  def foo; "original"; end
end

class A; include M; end
class B; include M; end

M.module_eval { define_method(:foo) { "modified" } }

A.new.foo  # => "modified"
B.new.foo  # => "modified"
# 兩類別共享同一模組方法定義,動態修改即時生效

常見組合模式


# 檔案載入 + 混入
require 'my_module'
class MyClass
  include MyModule    # 實例方法
  extend MyModule     # 類別方法(若模組設計支援)
end

# ActiveSupport::Concern 模式(Rails)
module MyConcern
  extend ActiveSupport::Concern
  
  included do
    # 類別層級執行:scope, validates, has_many 等
  end
  
  class_methods do
    # 定義類別方法
  end
end
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved