variable tipos programacion privados polimorfismo objetos instancia herencia globales con clases clase atributos ruby scope

tipos - variables de instancia ruby



Diferencia entre varios ámbitos de variables en ruby (4)

Ruby tiene 5 ámbitos variables:

  1. Variables locales : estas son las variables normales, ejemplo x = 25 , y = gaurish donde y son variables locales.
  2. Variables de instancia : se indican con el símbolo @ delante del nombre de la variable real. usado principalmente con clases, de modo que cada instancia / objeto de la clase tenga un valor diferente / separado. ejemplo. @employee.name = ''Alex''
  3. Variables de clase : denotados con @@ símbolos delante del nombre de la variable. variable de clase, creo que tienen el mismo valor accos todas las instancias / objeto.
  4. Variables globales : comienzan con $ symbol y son accesibles en todas partes . ejemplo $LOAD_PATH
  5. Constantes : debe comenzar con mayúscula pero por convención escrita en ALL_CAPS . aunque, es una constante, pero su valor no es constante y puede cambiarse (ruby lanzará una advertencia, sin embargo). Entonces, en el sentido, esto también actúa como una variable.

Como puede notar, todas las anteriores son variables que almacenan algún valor de algún tipo y su valor puede cambiarse. Pero, cada alcance hace algo un poco diferente. Tener 5 diferentes tipos de ámbitos variables me confunde. Principalmente, tengo dificultad para decidir en qué caso, debería estar usando un alcance particular en mi código. así que tengo algunas preguntas en mi mente. por favor conteste:

  1. Observé que las variables locales y las variables de clase permanecen iguales para todos los objetos / instancias, a diferencia de las variables de instancia. Entonces, ¿qué diferencia hay entre las variables locales y las variables de clase?
  2. ¿Se pueden usar variables locales en lugar de variables de clase? o viceversa. Y si es así, ¿por qué? Y si no, ¿por qué no?
  3. Las variables globales en ruby ​​me recuerdan las malvadas variables global $x en PHP. Las variables globales en ruby ​​también se consideran malas y, por lo tanto, no deberían utilizarse. O bien, hay casos específicos en los que tiene sentido usar variables globales en ruby?
  4. ¿Por qué las constantes no son constantes y permiten cambiar su valor? El valor de una constante por definición debe ser constante ¿no? de lo contrario, podemos usar otra variable y no cambiar su valor. sería eso equivalente a un CONSTANTE en rubí?
  5. ¿Alguna página / recurso / enlace que explique la diferencia entre 5 ámbitos de variable diferentes en ruby? Me gusta tener uno a mano para referencia.
  6. Bajo qué caso de uso, debería estar usando un ámbito de variable particular en mi código. así que uno podría explicar los 5 casos con un ejemplo de lata que sería genial, esta es mi principal razón de confusión.
  7. ¿Hay una elección de facto como public en Java? ¿Cuál sería la apuesta segura en la mayoría de los casos de uso?

Gracias por tomarse el tiempo para leer y responder preguntas


  1. Las variables de clase son las mismas para todas las instancias, porque son variables de clase asociadas a la clase. Todo accede a la misma variable, incluida cada instancia.

  2. No. Las variables locales son solo eso-locales. Pueden ser locales para una función, o locales para la declaración de clase , que es diferente de ser una variable de clase. Los locales en una declaración de clase quedan fuera del alcance cuando finaliza la declaración de clase.

  3. Eso es porque son exactamente lo mismo, son globales. El estado global es siempre malo; esto no es una propiedad del lenguaje o entorno. Dicho esto, es posible que se requiera algún estado global, así es como es. Tiene sentido usar estado global cuando hay estado global. El truco es usar el estado global de forma adecuada , lo que a veces es un esfuerzo no trivial.

  4. Así es Ruby.

  5. Uno ya ha sido dado por Chris.

  6. Pensaría que esta pregunta sería en gran medida autocontestadora. Global cuando todo el mundo necesita acceso. Instancia cuando es específico para una instancia de clase. Local cuando solo se requiere en un ámbito local (por ejemplo, un método, un bloque (tenga en cuenta las diferencias entre 1.8 y 1.9 con respecto al alcance del bloque), etc.) Constante cuando no se supone que la variable cambie. Una variable de clase cuando es algo que necesita cada instancia, o si se expone a través de un método de clase, algo estrechamente asociado con una clase.

  7. No hay "casos de uso más", depende totalmente de lo que esté haciendo con la variable. Y el public no es la opción de facto en Java, depende de la entidad en cuestión. El alcance predeterminado de Java es package-private (métodos, propiedades). Cuál usar en Ruby depende completamente del uso-caso, notando que como con Java, y aún más fácilmente en Ruby, las cosas se pueden eludir.


Aquí están mis dos centavos para esto y está escribiendo para programadores de c ++ / java / c #:

Una variable Ruby local / $ Global es un poco como la variable local / global de c ++ / java / c #.

Una variable Ruby @instance es como la propiedad variable / clase miembro de c ++ / java / c # a la que se puede acceder en cualquier método de miembro / clase miembro. Aunque la instancia Ruby se puede aplicar no solo a la clase sino también al Módulo Ruby.

Una variable Ruby @@ class es como una variable de miembro estática de c ++ / java que se comparte entre todas las instancias de la misma clase.


Encontré una buena y detallada explicación sobre diferentes ámbitos y sus visibilidades en Ruby en el siguiente enlace. Ámbitos y Visibilidades con ejemplos en detalle.

De acuerdo a esto ,

Class variable (@@a_variable): Available from the class definition and any sub-classes. Not available from anywhere outside. Instance variable (@a_variable): Available only within a specific object, across all methods in a class instance. Not available directly from class definitions. Global variable ($a_variable): Available everywhere within your Ruby script. Local variable (a_variable): It is available only in the particular method or block in ruby script.

Algunas explicaciones más sobre las variables de instancia son: Puede acceder a variables de instancia en cualquier método de esa clase en particular. Si bien no se puede acceder a las variables locales fuera del método. A continuación se muestra un ejemplo de Ruby Monk, que explica este concepto a fondo.

class Item def initialize(item_name, quantity) @item_name = item_name @quantity = quantity end def show puts @item_name puts @quantity supplier = "Acme corp" puts supplier end end Item.new("tv",1).show

Aquí el proveedor es una variable local a la que se puede acceder desde el método show solo en nuestro ejemplo. Solo intente declarar la variable del proveedor en el método de inicialización e imprimirlo en el método show. Dará un error como proveedor variable indefinido.

Espero que ayude. :)


Las variables locales no son equivalentes a las de clase, están vinculadas al bloque en el que se encuentra. Cualquier local declarado en un bloque se puede usar allí. Las variables de clase están vinculadas a la estructura de clase en la que se encuentra. La definición de una clase es en sí misma un bloque, por lo que puede acceder a las variables locales de manera similar, pero encontrará que si se refiere a su clase en un contexto diferente no puede consultar la variable local de la misma manera.

Las variables globales se consideran malas formas, si se abusa. OOP debería ayudarlo a estructurar sus programas de modo que no se necesiten constantes en todo el programa. Piense en ellos como si fueran globales: si no puede garantizar su consistencia en todo el mundo, como el valor de PI o si ama a su esposa o no, probablemente no debería hacer promesas.

Una vez que los domine, me parece que " Ruby Variable Scope " es una buena referencia.