2010-09-24 18 views
7

Soy usuario del framework Ruby on Rails y estoy pensando en devolverlo contribuyendo al código. Entiendo que hay una necesidad de una comprensión profunda del concepto del lenguaje Ruby para contribuir? ¿He clonado el proyecto, he mirado el código, revisado los tickets y no tengo ni idea de cómo comenzar? Por lo que veo, Rails Framework utiliza mucho la metaprogramación. Entonces, ¿qué otro aspecto de Ruby tengo que dominar para empezar a contribuir? o contribuir es conocer los pormenores de Ruby? ¡Gracias!¿Qué necesito saber para contribuir a Rails?

+1

No escuches a estos otros tipos, hay toneladas que puedes hacer ahora mismo sin conocer a Ruby. Comience con la documentación y las pruebas, siga subiendo de nivel conforme gane comprensión. –

+0

Acepto w/@Chuck Vose "Comience con la documentación y las pruebas, siga subiendo mientras gana entendimiento". Además, elija una parte del marco que le interese y escriba un complemento o dos que amplíe su capacidad. Esto realmente debería ayudar a entender los aspectos internos de esa área. Una vez que tenga esa comprensión, busque boletos @ para esa área y vea lo que puede hacer. ¡La mejor de las suertes! – Brian

Respuesta

4

Ha pasado bastante tiempo desde que me encontré con el código de rubí que no entendí, pero hay partes de los rieles que realmente impulsan mi comprensión del rubí.

Dicho esto, incluso si estás en un nivel intermedio con el idioma, descubrir cómo funcionan los rieles probablemente sea una gran manera de mejorar tu juego.

En cuanto a por dónde empezar, me gustaría empezar por escribir plugins. Piense en un plugin de onda en la que podría escribir que no se ha hecho todavía, o algo que usted piensa que podría ser mejor. Sea lo que sea que quieres hacer, es probable que va a necesitar para enganchar en una especie de carriles internos para hacerlo, lo que le dará un buen punto de partida. Una vez que tenga un poco de conocimiento de un área determinada del marco, ver si hay algún error abiertas en esa zona se puede arreglar.

La barrera es bastante alto, ya que los carriles es un programa bastante grande y compleja escrito por personas que tienen un alto nivel de maestría con un lenguaje muy flexible. También es un gran desafío que probablemente te haga un mejor programador al final. :)

Editar: para ayudar a cabo barandilla

Esto es realmente muy interesante si se trata de un fragmento diseñado para ilustrar cómo funcionan las variables de clase y clases simples, pero hay maneras mucho más claras a lograr lo mismo si es un código "real"

Singleton Clase

En Ruby, cada objeto tiene una clase padre que obtiene sus métodos de. Esto es bastante normal para los lenguajes OO. Lo que no es normal es el rubí también tiene un concepto llamado "objeto individuación, eso significa que los objetos pueden tener métodos que son sólo en un caso específico, pero no en la clase padre. Aquí es un ejemplo IRB rápida

irb(main):001:0> foo = "bar" 
=> "bar" 
irb(main):002:0> def foo.foo_method 
irb(main):003:1> "this is _only_ on the foo instance, not on all strings" 
irb(main):004:1> end 
=> nil 
irb(main):005:0> foo.foo_method 
=> "this is _only_ on the foo instance, not on all strings" 
irb(main):006:0> "bar".foo_method 
NoMethodError: undefined method `foo_method' for "bar":String 
    from (irb):6 
irb(main):007:0> foo = "New string" 
=> "New string" 
irb(main):008:0> foo.foo_method 
NoMethodError: undefined method `foo_method' for "New string":String 
    from (irb):8 

Primero, asignamos una cadena a una variable. Luego, definimos un método en esa instancia. Llamar al método funciona, pero llamar a una nueva cadena no funciona. Asignar una nueva instancia de cadena a nuestra variable foo tampoco tiene ese método foo

Para hacer posible la individuación de objetos, tiene que haber algo entre la instancia y la clase padre. Esa cosa es la clase singleton, y cada instancia tiene una que es única de todos los otros obje instancias ct. Cuando ruby ​​busca un método, observará la clase singleton antes de la clase padre.

creas o no, incluso si nunca han oído hablar de esto antes, probablemente ya han utilizado. Si desea añadir un "método de la clase" a algo, por lo general hace esto

class Foo 
    def self.bar 
    "i am on the class" 
    end 
end 

Foo.bar #=> "I am on the class" 

Para empezar desde la parte superior, la declaración class Foo es el equivalente exacto de esta Foo = Class.new do. Lo que está sucediendo es que está asignando una nueva instancia de tipo Clase a la constante Foo. (como un lado, esto es lo que me gusta de Ruby. La mayoría de la sintaxis es solo azúcar alrededor de algún concepto básico)

Dentro de una definición de clase, self se refiere a la clase, por lo que decir def self.bar es esencialmente decir "definir el Barra de métodos en la clase singleton de la instancia de clase que se almacena en la constante Foo ".

Si encuentra esto complejo, es porque lo es. No creo que haya nada más compilado en ruby ​​aparte de lo que sucede durante las búsquedas de métodos, y las clases de singleton son una gran parte de lo que lo hace tan complejo.

variables de clase

una variable de clase es prefijado por @@, y básicamente es una variable cuyo alcance es todos los casos, el objeto de clase, y todas las clases que heredan de la clase.Voy a hacer una rápida IRB para ilustrar esto en acción

irb(main):003:0* class Foo 
irb(main):004:1> @@instance_count = 0 
irb(main):005:1> 
irb(main):006:1* def initialize 
irb(main):007:2>  @@instance_count += 1 
irb(main):008:2> end 
irb(main):009:1> 
irb(main):010:1* def count 
irb(main):011:2>  @@instance_count 
irb(main):012:2> end 
irb(main):013:1> end 
=> nil 
irb(main):014:0> 
irb(main):015:0* class Bar < Foo 
irb(main):016:1> end 
=> nil 
irb(main):017:0> 
irb(main):018:0* f = Foo.new 
=> #<Foo:0x7fa9089c7da0> 
irb(main):019:0> f.count 
=> 1 
irb(main):020:0> 
irb(main):021:0* b = Bar.new 
=> #<Bar:0x7fa9089be0e8> 
irb(main):022:0> b.count 
=> 2 
irb(main):023:0> 
irb(main):024:0* f.count 
=> 2 

En primer lugar, definimos Foo. Foo tiene una variable de clase que rastrea cuántas instancias se crearon. Para hacer eso, incrementamos esa variable en el constructor, y finalmente solo definimos un getter rápido. Bar solo extiende Foo.

Ahora, para verlo en acción, hacemos un nuevo foo, y verificamos el recuento, que es 1. A continuación, creamos una nueva barra, y verificamos el recuento, ahora estamos en 2. Solo para asegurarnos que tanto Foo como Bar comparten el mismo conteo, revisamos nuestra instancia de foo nuevamente y ahora son 2.

Las variables de clase son una característica muy situacional que normalmente no se ve fuera del código de la estructura. Generalmente se usa cuando desea realizar un seguimiento de todas las instancias de una clase determinada.

barandillas Código

class << Object.new 
    @@var = 6 
end 


String.class_variable_get(:@@var) #=> 6 

Su código está mostrando estos dos conceptos en acción. Primero, abrimos la clase singleton de un nuevo objeto y le agregamos una variable de clase. Si fuera otra cosa que una variable de clase, esas primeras tres líneas serían el código ruby ​​más inútil del mundo. Pero dado que es una variable de clase, eso se vuelve visible para la clase, todas las instancias de la clase, todas las clases que heredan de la clase y todas las instancias de todas las clases que heredan de la clase. Como la clase de la que estamos hablando es objeto, eso significa todo. Así que hacer class_variable_get en String te lo da, pero podrías acceder a esa variable desde cualquier clase o instancia que quisieras.

lo siento

Esto se complected terriblemente materia que es muy difícil de explicar con claridad. Estos conceptos me tomaron aproximadamente una semana de esfuerzo bastante concertado para entender. Si tiene alguna pregunta sobre lo que escribí, siéntase libre de preguntar, pero no se desanime si no la "obtiene".

+0

Correcto, he intentado escribir algunos plugins basados ​​en Railscasts y Rails Guide y todavía estoy tratando de trabajar en ello ... Apreciar tu respuesta ... ¡y definitivamente intentaré llegar hasta allí! ¡Gracias! – Jai

+0

aquí hay un código de rubí que no entiendo ... le das una oportunidad también;): 'clase << Object.new; @@ var = 6; fin; String.class_variable_get (: @@ var) # => 6' :(:(:( – horseyguy

+0

@banister: escribí una explicación bastante larga en mi publicación :) –

0

Para trabajar en cualquier marco, necesita tener un entendimiento razonable del idioma o si conoce lotes en un área determinada, pero realmente póngase en contacto con las personas y simplemente hable con ellos pregunte en qué trabaja actualmente y si Siento que puedes ayudar a decir y darles tus ideas, etc. ... me refiero a que la comunidad de desarrolladores es muy agradable y el hecho de que pasen tiempo trabajando en algo para dar a otras personas gratis, así que siempre estarán felices de ayudar y probar e incluir e informarle si puede ayudar y de qué manera.

Pero sobre todo, un poco más a continuación, los pormenores y mejor si saben lotes en un área determinada

1

La idea es muy apreciado. Creo que respondes la pregunta tú mismo. Si no puede leer y/o entender el código de Rails, entonces ese es el cuello de botella. Sin siquiera mirar el código, supongo que usarán herencia, mixins y metaprogramación. Definitivamente deberías tratar de estudiar esos aspectos independientemente de si contribuirás a Rails. Son conceptos esenciales en las bibliotecas Ruby, Rails y Ruby/Rails.

2

RoR tiene un montón de lugares que puedes comenzar pero que pueden no ser lo que estás viendo. El primer lugar para comenzar es probablemente la documentación here. Necesitarás conocer una tonelada de Ruby a un nivel profundamente personal para contribuir con parches básicos serios, pero puedes participar en las discusiones ahora mismo y puedes mejorar la documentación de una manera que el equipo central realmente, realmente, realmente necesariamente.

Lo sentimos, vincular mejor here

1

Creo que su respuesta es un montón de sus propias preguntas: sí, es necesario entender Ruby a contribuir a un proyecto Ruby.

Si quieres aprender, puedes recoger un ticket y empezar a piratearlo: ¡no hay nada como saltar en la parte más profunda! Sin embargo, creo que sólo se puede comenzar a contribuir de manera eficaz a un proyecto, una vez que usted ha utilizado lo suficiente por sí mismo para comprender:

  • Lo que existen características y son útiles, y cómo funcionan
  • ¿Qué características son insuficientes y necesita ayuda
  • lo que está claro o confuso y necesita documentación

Todo lo anterior debe provenir de necesidades del mundo real: de lo contrario no se puede exponer su caso por qué alguna característica que ideó necesidades para agregar ...

0

Además del comentario que dejé en su pregunta original ...

Ryan Bates fama (de Railscasts) dio a conocer recientemente 2 grabaciones de pantalla en la que camina a través de la parte interna de los carriles 3 router. Descubrí que es un excelente enfoque de & para leer y entender el código de framework. Si tienes la oportunidad, comprobar a cabo:

Tal vez estos 'moldes pueden ayudarle a ser más cómodo en la construcción de su enfoque para conseguir abajo con el código de la arquitectura.

Espero que esto ayude!

Cuestiones relacionadas