2012-06-15 38 views
35

Eventuali duplicati:
What does :: mean in Ruby?. vs :: (dot vs. doppio due punti) per chiamare un metodo

sto imparando Rubino dal Poignant Guide to Ruby e in alcuni degli esempi di codice, mi sono imbattuto usi del doppio colon e di punti che sembrano essere utilizzato per lo stesso scopo:

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

Nel codice precedente, il il doppio punto viene utilizzato per accedere al metodo open della classe File. Tuttavia, mi sono imbattuto in seguito il codice che ha utilizzato un punto per lo stesso scopo:

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 

Questa volta, un punto viene utilizzato per accedere al metodo della classe Fileread. Qual è la differenza tra:

File.read() 

e

File::open() 
+0

Sede [Che cosa è double-colon di Ruby? (: :) tutto su] (http://stackoverflow.com/questions/3009477/what-is-rubys- doppio colon-all-about). – sczizzo

+26

Davvero non penso che questo sia un duplicato di quello. In nessuna parte di questa domanda o delle sue risposte è l'uso di '::' per quanto riguarda i metodi singleton discussi. –

+8

Sono d'accordo. Ho visto quell'altra domanda prima di aprire questa. Tuttavia, la risposta alla mia domanda non è stata data esplicitamente. L'altra domanda riguarda l'uso esclusivo dell'operatore ::. Forse i suoi suggerimenti sull'uso dell'operatore puntino in modo sottile, ma quando sei nuovo a qualcosa, hai bisogno della risposta in una forma ben diversa. E come ho affermato, sono nuovo del rubino. – flyingarmadillo

risposta

21

E 'il scope resolution operator.

Un esempio da 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

Questo non risponde alla domanda: "qual è la differenza tra' File.read() 'e' File :: open() '?". E perché entrambi possono essere usati per chiamare un metodo? Quando dovremmo scegliere l'uno rispetto all'altro? – antinome

+26

Non c'è alcuna differenza tra :: e. quando si chiamano i metodi di classe (statici) in funzionalità. Ma puoi usare :: per accedere a costanti e ad altri oggetti con nomi, per i quali non puoi usare punti. Personalmente uso sempre puntini, ma il mio collega usa :: per chiamare metodi statici. Forse è un po 'esteticamente più bello quando si chiama una cosa con nomi, come Foo :: Bar :: open (invece di Foo :: Bar.open), ma funziona allo stesso modo in entrambi i modi. Anche le prestazioni sono le stesse. Post scriptum Ecco una bella discussione su questo argomento: https://www.ruby-forum.com/topic/107527 –

+8

@DaliborFilus commento dovrebbe essere la risposta accettata, davvero ... –

Problemi correlati