- A
- B
- D
- H
- I
- P
- T
- W
- Java
常數
APP_PATH | = | File.expand_path("test/dummy/config/application", ENGINE_ROOT) |
執行個體公開方法
acts_like?(duck) 連結
提供一種方式來檢查某個類別是否根據適當命名的標記方法的存在而表現得像其他類別。
提供與 SomeClass
相同介面的類別可以定義名為 acts_like_some_class?
的標記方法,以向 acts_like?(:some_class)
的呼叫者發出其相容性信號。
例如,Active Support 延伸 Date
以定義 acts_like_date?
方法,並延伸 Time
以定義 acts_like_time?
。因此,開發人員可以呼叫 x.acts_like?(:time)
和 x.acts_like?(:date)
來測試鴨子型別相容性,而能夠像 Time
一樣運作的類別也可以定義 acts_like_time?
方法來進行互操作。
請注意,標記方法預期只會存在。它不會被呼叫,因此其主體或傳回值無關緊要。
範例:提供與 String
相同介面的類別
此類別可能會定義
class Stringish
def acts_like_string?
end
end
然後,用戶端程式碼可以這樣查詢鴨子型別安全性
Stringish.new.acts_like?(:string) # => true
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/acts_like.rb, line 33 def acts_like?(duck) case duck when :time respond_to? :acts_like_time? when :date respond_to? :acts_like_date? when :string respond_to? :acts_like_string? else respond_to? :"acts_like_#{duck}?" end end
blank?() 連結
如果物件為 false、空或空白字串,則為空白。例如,nil
、”,‘ ’、[]、{} 和 false
都是空白。
這簡化了
!address || address.empty?
為
address.blank?
@return [true, false]
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 18 def blank? respond_to?(:empty?) ? !!empty? : !self end
deep_dup() 連結
如果物件可複製,則傳回物件的深度複製。如果不可複製,則傳回 self
。
object = Object.new
dup = object.deep_dup
dup.instance_variable_set(:@a, 1)
object.instance_variable_defined?(:@a) # => false
dup.instance_variable_defined?(:@a) # => true
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 15 def deep_dup duplicable? ? dup : self end
duplicable?() 連結
您能安全地複製此物件嗎?
方法物件為 false;其他為 true。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/duplicable.rb, line 26 def duplicable? true end
html_safe?() 連結
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 7 def html_safe? false end
in?(another_object) 連結
如果此物件包含在引數中,則傳回 true。
當引數為 Range
時,#cover?
用於適當處理開範圍內的包含檢查。否則,引數必須是任何回應 #include?
的物件。用法
characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true
對於非 Range
引數,如果引數未回應 #include?
,這將會擲回 ArgumentError
。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 15 def in?(another_object) case another_object when Range another_object.cover?(self) else another_object.include?(self) end rescue NoMethodError raise ArgumentError.new("The parameter passed to #in? must respond to #include?") end
instance_values() 連結
傳回一個雜湊,其中字串鍵會將不帶「@」的實例變數名稱對應到其對應的值。
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 14 def instance_values instance_variables.to_h do |ivar| [ivar[1..-1].freeze, instance_variable_get(ivar)] end end
instance_variable_names() 連結
傳回一個陣列,其中包含實例變數名稱(字串形式,包含「@」)。
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_variable_names # => ["@y", "@x"]
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 30 def instance_variable_names instance_variables.map(&:name) end
presence() 連結
如果接收方存在,則傳回接收方,否則傳回 nil
。object.presence
等同於
object.present? ? object : nil
例如,類似
state = params[:state] if params[:state].present?
country = params[:country] if params[:country].present?
region = state || country || 'US'
會變成
region = params[:state].presence || params[:country].presence || 'US'
@return [Object]
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 45 def presence self if present? end
presence_in(another_object) 連結
如果接收方包含在引數中,則傳回接收方,否則傳回 nil
。引數必須是任何回應 #include?
的物件。用法
params[:bucket_type].presence_in %w( project calendar )
如果引數未回應 #include?
,這將擲回 ArgumentError
。
@return [Object]
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 34 def presence_in(another_object) in?(another_object) ? self : nil end
present?() 連結
如果物件不空白,則表示存在。
@return [true, false]
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 25 def present? !blank? end
to_param() 連結
to_s
的別名。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 7 def to_param to_s end
to_query(key) 連結
將物件轉換成適合用於 URL 查詢字串的字串,使用指定的 key
作為參數名稱。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 13 def to_query(key) "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}" end
try(*args, &block) 連結
呼叫名稱作為第一個參數的公開方法,就像 public_send
所做的一樣,但如果接收器沒有回應,呼叫會傳回 nil
而不是引發例外狀況。
定義這個方法可以寫成
@person.try(:name)
而不是
@person.name if @person
try
呼叫可以串連
@person.try(:spouse).try(:name)
而不是
@person.spouse.name if @person && @person.spouse
如果接收器沒有回應方法,try
也會傳回 nil
@person.try(:non_existing_method) # => nil
而不是
@person.non_existing_method if @person.respond_to?(:non_existing_method) # => nil
如果在 nil
上呼叫 try
,它會傳回 nil
,無論它是否回應方法
nil.try(:to_i) # => nil, rather than 0
如果呼叫,引數和區塊會轉送給方法
@posts.try(:each_slice, 2) do |a, b|
...
end
簽章中的引數數量必須相符。如果物件回應方法,呼叫會嘗試進行,如果引數不符,仍然會引發 ArgumentError
。
如果在沒有引數的情況下呼叫 try
,它會將接收器傳遞給指定的區塊,除非它是 nil
@person.try do |p|
...
end
您也可以在不接受引數的情況下使用區塊呼叫 try,區塊將會被 instance_eval
@person.try { upcase.truncate(50) }
請注意,try
定義在 Object
上。因此,它不適用於沒有 Object
在其祖先中的類別實例,例如 BasicObject
的直接子類別。
來源:在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/try.rb, line 39
try!(*args, &block) 連結
與 try
相同,但如果接收器不是 nil
且未實作嘗試的方法,則會引發 NoMethodError
例外狀況。
"a".try!(:upcase) # => "A"
nil.try!(:upcase) # => nil
123.try!(:upcase) # => NoMethodError: undefined method `upcase' for 123:Integer
來源:在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/try.rb, line 104
with(**attributes) 連結
設定和還原區塊周圍的公開屬性。
client.timeout # => 5
client.with(timeout: 1) do
client.timeout # => 1
end
client.timeout # => 5
這個方法是常見的 begin/ensure 模式的簡寫
old_value = object.attribute
begin
object.attribute = new_value
# do things
ensure
object.attribute = old_value
end
只要讀取器和寫入器方法都是公開的,它就可以用於任何物件。
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/with.rb, line 24 def with(**attributes) old_values = {} begin attributes.each do |key, value| old_values[key] = public_send(key) public_send("#{key}=", value) end yield ensure old_values.each do |key, old_value| public_send("#{key}=", old_value) end end end
with_options(選項, &區塊) 連結
一種優雅的方式,可以從傳遞給一系列方法呼叫的選項中排除重複。區塊中呼叫的每個方法,其中區塊變數為接收器,其選項將與提供的預設 選項
雜湊
或類似 雜湊
的物件合併。在區塊變數上呼叫的每個方法都必須將選項雜湊作為其最後一個引數。
沒有 with_options
,此程式碼包含重複
class Account < ActiveRecord::Base
has_many :customers, dependent: :destroy
has_many :products, dependent: :destroy
has_many :invoices, dependent: :destroy
has_many :expenses, dependent: :destroy
end
使用 with_options
,我們可以移除重複
class Account < ActiveRecord::Base
with_options dependent: :destroy do |assoc|
assoc.has_many :customers
assoc.has_many :products
assoc.has_many :invoices
assoc.has_many :expenses
end
end
它也可以與明確的接收器一起使用
I18n.with_options locale: user.locale, scope: 'newsletter' do |i18n|
subject i18n.t :subject
body i18n.t :body, user_name: user.name
end
當您不傳遞明確的接收器時,它會在合併選項內容中執行整個區塊
class Account < ActiveRecord::Base
with_options dependent: :destroy do
has_many :customers
has_many :products
has_many :invoices
has_many :expenses
end
end
with_options
也可以巢狀,因為呼叫會轉發給其接收器。
注意:每個巢狀層級除了自己的預設值之外,還會合併繼承的預設值。
class Post < ActiveRecord::Base
with_options if: :persisted?, length: { minimum: 50 } do
validates :content, if: -> { content.present? }
end
end
程式碼等於
validates :content, length: { minimum: 50 }, if: -> { content.present? }
因此,會忽略 if
鍵的繼承預設值。
注意:您無法在 with_options
內部隱式呼叫類別方法。您可以改用類別名稱存取這些方法
class Phone < ActiveRecord::Base
enum :phone_number_type, { home: 0, office: 1, mobile: 2 }
with_options presence: true do
validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys }
end
end
當省略區塊引數時,會傳回已裝飾的 Object
執行個體
module MyStyledHelpers
def styled
with_options style: "color: red;"
end
end
styled.link_to "I'm red", "/"
# => <a href="/" style="color: red;">I'm red</a>
styled.button_tag "I'm red too!"
# => <button style="color: red;">I'm red too!</button>
來源:顯示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/with_options.rb, line 92 def with_options(options, &block) option_merger = ActiveSupport::OptionMerger.new(self, options) if block block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger) else option_merger end end