2012-05-18 23 views
5

Ruby è linguaggio completamente orientato agli oggetti. In ruby, tutto è un oggetto & quindi, appartiene ad alcune classi. per esempio 5 appartiene Object classRuby è davvero un linguaggio completamente orientato agli oggetti?

1.9.3p194 :001 > 5.class 
=> Fixnum 
1.9.3p194 :002 > 5.class.superclass 
=> Integer 
1.9.3p194 :003 > 5.class.superclass.superclass 
=> Numeric 
1.9.3p194 :005 > 5.class.superclass.superclass.superclass 
=> Object 
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass 
=> BasicObject 
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass 
=> nil 

così, dobbiamo chiamare tutti i metodi anteponendo nome della classe/oggetto come in Object_name#method_name. Esempio:

5.times{|i| puts i} 

ora, rotaie ha questi cosiddetti aiutanti come stylesheet_link_tag, javascript_include_tag, form_for ecc che non seguono questa sintassi Object_name#method_name, quindi credo che siano le funzioni normali.

quindi la mia domanda è

  1. Quali sono queste rotaie aiutanti?
  2. Se funzionano solo & non ereditano da qualsiasi classe. Questo non contraddice l'affermazione fatta dicendo - in ruby, everything a object & there are no primitives. Come esempio, le persone citano 5.+(6) dicendo che anche gli operatori sono solo metodi semplici ?
+1

Quando si vede chiamata di metodo senza ricevitore esplicito, allora il ricevitore è 'self'. Come hai concluso esattamente che "tutto è un oggetto" non è vero? –

+0

Ohk, non sapevo se stessi. Immagino di aver sbagliato, grazie! – CuriousMind

+1

Aggiungo a una risposta :) –

risposta

8

Per le altre cose chiamate senza un ricevitore, guarda il modulo Kernel, in cui si definisce roba come puts. Poiché il modulo è incluso in Object, i suoi metodi sono disponibili ovunque. In che modo esattamente ciò contraddice il - IMHO abusato - che tutto è un oggetto?

+0

Quindi questi metodi sono definiti in un modulo, anziché in classe? la tua risposta è diventata il mio * aha * momento della giornata. interessante! – CuriousMind

4

Quando viene visualizzato il richiamo del metodo senza ricevitore esplicito, il destinatario è self. Gli oggetti possono ottenere metodi in molti modi diversi. Uno, il più ovvio, è quando definisci i metodi da solo. Quindi puoi anche includere i moduli.

class Person 
    # this adds a bunch of methods to Person, making it a Mongoid model 
    include Mongoid::Document 
end 

I moduli inclusi e le classi ereditate da possono acquisire funzionalità allo stesso modo.

Quindi, quando vedi il metodo senza ricevitore, pensa "cosa è self a questo punto? Qual è la sua classe? Quali metodi ha definito? Quali moduli include?" Scoprirai molte cose interessanti su ruby ​​e rail. :)

5

Questi helper dei tag di tag rails sono un sottomodulo di ActionView, ActionView::Helpers::AssetTagHelper che fornisce metodi per generare HTML che collega le viste ad asset come immagini, javascript, fogli di stile e feed.

Come modules hanno class come una superclasse che significa che i AssetTagHelpers avranno anche lo

irb(main):016:0> ActionView::Helpers::AssetTagHelper 
=> ActionView::Helpers::AssetTagHelper 
irb(main):017:0> ActionView::Helpers::AssetTagHelper.class 
=> Module 
irb(main):018:0> ActionView::Helpers::AssetTagHelper.class.superclass 
=> Object 
irb(main):019:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass 
=> BasicObject 
irb(main):020:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass.superclass 
=> nil 

NOTA: Per ragioni di semplicità mi concentrerò solo sul JavascriptIncludeTag ma sono tutti abbastanza simili.

Qui troverete una classe chiamata ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

Che si può essere istanziare

JavascriptIncludeTag.new(config, asset_paths) 

La classe JavascriptIncludeTag ha un metodo chiamato asset_tag che poi chiama un metodo content_tag e restituisce il tag corretto.

percorso: /actionpack/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb

require 'action_view/helpers/asset_tag_helpers/asset_include_tag' 

# NOTE: on the 'action_view/helpers/asset_tag_helpers/asset_include_tag' it requires '/actionpack/lib/action_view/helpers/tag_helper.rb' so now all this files are connected :) 
. 
. 
. 
def asset_tag(source, options) 
    content_tag("script", "", { "src" => path_to_asset(source) }.merge(options)) 
end 

percorso: /actionpack/lib/action_view/helpers/tag_helper.rb

def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block) 
    if block_given? 
    options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash) 
    content_tag_string(name, capture(&block), options, escape) 
    else 
    content_tag_string(name, content_or_options_with_block, options, escape) 
    end 
end 

In modo che è più meno come funzionano.

NOTA: Se hai trovato la mia spiegazione un po 'complicato fammelo sapere e io modificato per fornire una spiegazione migliore

Problemi correlati