Ruby on Rails 5.2 - Object

कक्षा वस्तु




ruby

कक्षा वस्तु

जनक:
BasicObject
शामिल मॉड्यूल:

स्थिरांक

APP_PATH

सार्वजनिक प्रवृत्ति के तरीके

की तरह अभिनय करता है? (बतख) दिखाएँ स्रोत
# File activesupport/lib/active_support/core_ext/object/acts_like.rb, line 9
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

एक बतख-प्रकार सहायक विधि। उदाहरण के लिए, सक्रिय समर्थन एक acts_like_date? को परिभाषित करने के लिए Date बढ़ाता है acts_like_date? विधि, और acts_like_time? को परिभाषित करने के लिए Time acts_like_time? । परिणामस्वरूप, हम x.acts_like?(:time) और x.acts_like?(:date) को बतख-प्रकार-सुरक्षित तुलना करने के लिए कर सकते हैं, क्योंकि acts_like_time? वर्गों को हम Time तरह काम करना चाहते हैं, उन्हें बस एक acts_like_time? को परिभाषित करने की आवश्यकता है acts_like_time? तरीका।

# File activesupport/lib/active_support/core_ext/object/blank.rb, line 19
def blank?
  respond_to?(:empty?) ? !!empty? : !self
end

एक वस्तु रिक्त है यदि यह गलत है, खाली है, या एक व्हाट्सएप स्ट्रिंग है। उदाहरण के लिए, false , '', '', nil , [], और {} सभी रिक्त हैं।

यह सरल करता है

!address || address.empty?

सेवा मेरे

address.blank?

@ ग्रेट [सच, झूठ]

# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 15
def deep_dup
  duplicable? ? dup : self
end

यदि वह डुप्लिकेट है, तो ऑब्जेक्ट की गहरी प्रतिलिपि लौटाता है। यदि यह डुप्लिकेट नहीं है, तो 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
# File activesupport/lib/active_support/core_ext/object/duplicable.rb, line 26
def duplicable?
  true
end

क्या आप सुरक्षित रूप से इस ऑब्जेक्ट को डुबो सकते हैं?

विधि वस्तुओं के लिए गलत; सच है अन्यथा।

# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 123
def html_safe?
  false
end
में? (other_object) स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 12
def in?(another_object)
  another_object.include?(self)
rescue NoMethodError
  raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
end

यदि यह ऑब्जेक्ट तर्क में शामिल है, तो सही है। तर्क किसी भी वस्तु का होना चाहिए जो कि #include? जवाब दे #include? । उपयोग:

characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true

यदि तर्क #include? जवाब नहीं देता है, तो यह एक ArgumentError को फेंक देगा #include?

# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 14
def instance_values
  Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }]
end

स्ट्रिंग कुंजियों के साथ एक हैश लौटाता है, जो अपने संबंधित मानों के बिना "@" के चर नामों का उदाहरण देता है।

class C
  def initialize(x, y)
    @x, @y = x, y
  end
end

C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 27
def instance_variable_names
  instance_variables.map(&:to_s)
end

"@" सहित स्ट्रिंग के रूप में उदाहरण चर नामों की एक सरणी लौटाता है।

class C
  def initialize(x, y)
    @x, @y = x, y
  end
end

C.new(0, 1).instance_variable_names # => ["@y", "@x"]
उपस्थिति () स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 46
def presence
  self if present?
end

यदि यह मौजूद है तो रिसीवर लौटाता है अन्यथा 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'

@ ग्रेट [वस्तु]

उपस्थिति_इन (अन्य_बॉजेक्ट) स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 26
def presence_in(another_object)
  in?(another_object) ? self : nil
end

यदि यह तर्क में शामिल है तो रिसीवर लौटाता है अन्यथा nil लौटाता है। तर्क किसी भी वस्तु का होना चाहिए जो कि #include? जवाब दे #include? । उपयोग:

params[:bucket_type].presence_in %w( project calendar )

यदि तर्क #include? जवाब नहीं देता है, तो यह एक ArgumentError को फेंक देगा #include?

@ ग्रेट [वस्तु]

वर्तमान? () स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 26
def present?
  !blank?
end

एक वस्तु मौजूद है अगर यह खाली नहीं है।

@ ग्रेट [सच, झूठ]

# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 7
def to_param
  to_s
end

अन्य का to_s

to_query (कुंजी) स्रोत दिखाएं
# 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

किसी ऑब्जेक्ट को URL क्वेरी स्ट्रिंग के रूप में उपयोग करने के लिए उपयुक्त स्ट्रिंग में कनवर्ट करता है, दिए गए key को परम नाम के रूप में उपयोग करता है।

प्रयास करें (* a; और b) स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/try.rb, line 93
  

सार्वजनिक विधि को आमंत्रित करता है जिसका नाम public_send की तरह ही पहला तर्क है, सिवाय इसके कि यदि रिसीवर इसका जवाब नहीं देता है तो कॉल अपवाद को बढ़ाने के बजाय कॉल रिटर्न देता है।

इस विधि को लिखने में सक्षम होने के लिए परिभाषित किया गया है

@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

आप एक तर्क को स्वीकार किए बिना ब्लॉक के साथ प्रयास भी कर सकते हैं, और ब्लॉक इसके बजाय inst_eval'ed होगा:

@person.try { upcase.truncate(50) }

कृपया ध्यान दें कि try Object पर परिभाषित किया गया है। इसलिए, यह उन वर्गों के उदाहरणों के साथ काम नहीं करेगा जिनके पास अपने पूर्वजों के बीच Object नहीं है, जैसे कि BasicObject प्रत्यक्ष उपवर्ग।

प्रयास करें! (* a; & b) स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/try.rb, line 105

try रूप में भी, लेकिन एक NoMethodError अपवाद उठाता है अगर रिसीवर nil नहीं है और कोशिश की गई विधि को लागू नहीं करता है।

"a".try!(:upcase) # => "A"
nil.try!(:upcase) # => nil
123.try!(:upcase) # => NoMethodError: undefined method `upcase' for 123:Integer
unescape (str, escaped = /% [a-fA-F \ d] {2} /) शो सोर्स
# File activesupport/lib/active_support/core_ext/uri.rb, line 8
def unescape(str, escaped = /%[a-fA-F\d]{2}/)
  # TODO: Are we actually sure that ASCII == UTF-8?
  # YK: My initial experiments say yes, but let's be sure please
  enc = str.encoding
  enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
  str.dup.force_encoding(Encoding::ASCII_8BIT).gsub(escaped) { |match| [match[1, 2].hex].pack("C") }.force_encoding(enc)
end
with_options (विकल्प, और ब्लॉक) स्रोत दिखाएं
# File activesupport/lib/active_support/core_ext/object/with_options.rb, line 78
def with_options(options, &block)
  option_merger = ActiveSupport::OptionMerger.new(self, options)
  block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger)
end

विधि कॉलों की एक श्रृंखला के लिए पारित विकल्पों में से कारक दोहराव का एक सुंदर तरीका है। प्रखंड में प्रत्येक विधि जिसे रिसीवर के रूप में ब्लॉक वैरिएबल के साथ दिया गया है, उसके विकल्प उपलब्ध कराए गए डिफ़ॉल्ट 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 का उपयोग 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 कुंजी को अनदेखा किया जाता है 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