2012-06-15 9 views
35

Duplicar posible:
What does :: mean in Ruby?. vs :: (punto vs-dos puntos dobles) para llamar a un método

estoy aprendiendo Rubí de la Poignant Guide to Ruby y en algunos de los ejemplos de código, me encontré con usos del doble de colon y de puntos que parecen ser utilizado para el mismo propósito:

File::open('idea-' + idea_name + '.txt', 'w') do |f| 
    f << idea 
end 

En el código anterior, la Se está utilizando dos puntos para acceder al método open de la clase File. Sin embargo, más tarde me encontré con código que utiliza un punto para el mismo propósito:

require 'wordlist' 
# Print each idea out with the words fixed 
Dir['idea-*.txt'].each do |file_name| 
    idea = File.read(file_name) 
    code_words.each do |real, code| 
    idea.gsub!(code, real) 
    end 
puts idea 
end 

Esta vez, un punto se está utilizando para acceder al método de la clase Fileread. ¿Cuál es la diferencia entre:

File.read() 

y

File::open() 
+0

Ver [Lo que es doble de colon de Ruby (?: :) todo] (http://stackoverflow.com/questions/3009477/what-is-rubys- doble-colon-todo-alrededor). – sczizzo

+26

Realmente no creo que esto sea un duplicado de eso. En ninguna parte de esa pregunta o sus respuestas está el uso de '::' con respecto a los métodos únicos discutidos. –

+8

Estoy de acuerdo. Vi esa otra pregunta antes de abrir esta. Sin embargo, la respuesta a mi pregunta no fue explícitamente dada. La otra pregunta discute el uso exclusivo del operador ::. Tal vez su insinuación sobre el uso del operador punto sea sutil, pero cuando eres nuevo en algo, necesitas la respuesta en una forma muy distinta. Y como dije, soy nuevo en ruby. – flyingarmadillo

Respuesta

21

Es la scope resolution operator.

Un ejemplo de Wikipedia:

module Example 
    Version = 1.0 

    class << self # We are accessing the module's singleton class 
    def hello(who = "world") 
     "Hello #{who}" 
    end 
    end 
end #/Example 

Example::hello # => "Hello world" 
Example.hello "hacker" # => "Hello hacker" 

Example::Version # => 1.0 
Example.Version # NoMethodError 

# This illustrates the difference between the message (.) operator and the scope 
# operator in Ruby (::). 
# We can use both ::hello and .hello, because hello is a part of Example's scope 
# and because Example responds to the message hello. 
# 
# We can't do the same with ::Version and .Version, because Version is within the 
# scope of Example, but Example can't respond to the message Version, since there 
# is no method to respond with. 
+18

Esto no responde a la pregunta: "¿cuál es la diferencia entre' File.read() 'y' File :: open() '?". ¿Y por qué ambos pueden usarse para llamar a un método? ¿Cuándo elegiríamos uno sobre el otro? – antinome

+26

No hay diferencia entre :: y. al llamar a métodos de clase (estáticos) en la funcionalidad. Pero puede usar :: para acceder a las constantes y otras cosas del espacio de nombres, para las cuales no puede usar el punto. Personalmente uso dot todo el tiempo, pero mi colega usa :: para llamar a métodos estáticos. Tal vez es algo estéticamente mejor cuando llamas a cosas con nombres de espacio, como Foo :: Bar :: open (en lugar de Foo :: Bar.open), pero funciona de la misma manera. El rendimiento es lo mismo también. PD Aquí hay una agradable discusión sobre este tema: https://www.ruby-forum.com/topic/107527 –

+8

@DaliborFilus comentario debería ser la respuesta aceptada, realmente ... –

Cuestiones relacionadas