2012-05-18 24 views
5

Ruby es lenguaje totalmente orientado a objetos. En ruby, todo es un objeto & por lo tanto, pertenece a alguna clase. por ejemplo 5 pertenece a Object class¿El rubí es realmente un lenguaje completamente orientado a objetos?

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 

lo tanto, tenemos que llamar a todos los métodos anteponiendo nombre de la clase/objeto como en Object_name#method_name. ejemplo:

5.times{|i| puts i} 

ahora, rieles tiene estos llamados ayudantes como stylesheet_link_tag, javascript_include_tag, form_for, etc, que no siguen esta sintaxis Object_name#method_name, así que supongo que son funciones simplemente normales.

así que mi pregunta es

  1. ¿Cuáles son estos carriles ayudantes?
  2. Si solo funcionan & no heredan de cualquier clase. ¿Eso no contradice la afirmación hecha diciendo - en ruby, everything a object & there are no primitives. Como ejemplo, las personas citan 5.+(6) diciendo que incluso los operadores son solo métodos simples?
+1

Cuando vea método de invocación explícita sin el receptor, el receptor es 'self'. ¿Cómo exactamente concluiste que "todo es un objeto" no es verdad? –

+0

Oh, no sabía sobre 'self'. ¡Creo que estaba equivocado, gracias! – CuriousMind

+1

Actualizaré esto a una respuesta :) –

Respuesta

8

Para otras cosas llamadas sin un receptor, consulte el módulo Kernel, donde se define la materia como puts. Como el módulo está incluido en Object, sus métodos están disponibles en todas partes. ¿Cómo exactamente eso podría contradecir el uso excesivo de mi humilde opinión, decir que todo es un objeto?

+0

Entonces, ¿estos métodos se definen en un módulo, en lugar de clase? su respuesta se ha convertido en mi * aha * momento del día. ¡interesante! – CuriousMind

4

Cuando vea la invocación de método sin receptor explícito, entonces el receptor es self. Los objetos pueden obtener métodos de muchas maneras diferentes. Uno, más obvio, es cuando defines los métodos tú mismo. Entonces también puedes incluir módulos.

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

Los módulos que incluye y las clases heredadas pueden adquirir la funcionalidad de la misma manera.

Entonces, cuando vea el método sin receptor, piense "¿qué es self en este momento? ¿Cuál es su clase? ¿Qué métodos tiene definido? ¿Qué módulos incluye?" Descubrirá muchas cosas interesantes sobre el rubí y los rieles. :)

5

Estos rieles active tag helpers son un submódulo de ActionView, ActionView::Helpers::AssetTagHelper que proporciona métodos para generar HTML que vincula vistas a activos tales como imágenes, javascripts, hojas de estilo y feed.

Como modules tienen class como una superclase que significa que los AssetTagHelpers también tendrán que

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: Por razones de simplicidad sólo se me centraré en la JavascriptIncludeTag pero son todos bastante similares.

Aquí encontrará una clase llamada ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

¿Qué puede ser una instancia de

JavascriptIncludeTag.new(config, asset_paths) 

La clase JavascriptIncludeTag tiene un método llamado asset_tag que a su vez llama a un método content_tag y devuelve la etiqueta correcta.

ruta: /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 

ruta: /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 

Para que es más, menos cómo funcionan.

NOTA: Si has encontrado mi explicación un poco complicado, házmelo saber y voy a editar para proporcionar una explicación mejor

Cuestiones relacionadas