2009-05-17 4 views
9

stavo leggendo un libro Ruby e sono imbattuto in questa definizione di pseudo-variabile self:Rubino Definizione del Sé

auto - ricevitore oggetto del metodo corrente

Qualcuno potrebbe abbattere quella definizione e spiega cosa significa? Non ne capisco niente.

EDIT: In realtà ho una buona idea di cosa sia il sé (e le sue applicazioni) e so come cercare su Google. Mi stavo chiedendo se qualcuno potesse spiegare la definizione che ho citato. Questo nello specifico.

+0

http://www.jimmycuadra.com/posts/self-in-ruby – royhowie

risposta

11

self è una variabile speciale che cambia in base al contesto. Per essere più specifici, è oggetto ricevitore del metodo attuale, come hai menzionato. Per capire questo, dobbiamo capire che cosa significa il ricevente.

Vedere Programming Ruby: More About Methods e Classes and Objects.

si chiama un metodo specificando un ricevitore , il nome del metodo, e opzionalmente alcuni parametri ed un blocco associato.

connection.downloadMP3("jitterbug") { |p| showProgress(p) } 

In questo esempio, l'oggetto connection è il ricevitore, downloadMP3 è il nome del metodo, "jitterbug" è il parametro , e il materiale tra i parentesi è il blocco associato.

foo = "hello" 
bar = foo.dup 
class <<foo 
    def to_s 
    "The value is '#{self}'" 
    end 
    def twoTimes 
    self + self 
    end 
end 

foo.to_s  » "The value is 'hello'" 
foo.twoTimes » "hellohello" 
bar.to_s  » "hello" 

In foo.twoTimes, foo parte è chiamato il destinatario della chiamata al metodo. Pertanto, nel metodo twoTimes, self fa riferimento all'oggetto foo nel contesto.

There is also a very good explanation here

+0

@MauricioGracia Non so quale fosse l'intento del montaggio. Se il link è utile, non dovrebbe stare da solo come risposta? –

+0

l'intento del montaggio era quello di integrare una buona risposta - usare un singolo link come risposta è una cattiva pratica (di solito suggeriscono di posizionare il contenuto del link invece del solo link) –

17

Ruby e altri linguaggi (come Smalltalk e Objective-C) preferiscono il termine "message passing", mentre Java e C++ preferiscono "chiamata di metodo". Cioè, il "modo Java" consiste nel chiamare un metodo su un oggetto — codice in esecuzione nel contesto di un oggetto — mentre il "modo Ruby" è inviare un oggetto a un messaggio, al quale risponde l'oggetto eseguendo il suo metodo.

Ruby descrive la riga my_string.length come "invio my_string messaggio" length ". Il my_string riceve il messaggio, e così viene chiamato il destinatario; all'interno della definizione del metodo length, self fare riferimento a my_string. È possibile ottenere lo stesso effetto con my_string.send(:length).

Pensare a questo concetto in termini di passaggio di messaggi è più flessibile del pensare in termini di invocazione del metodo. Per invocare un metodo su un oggetto, tale metodo deve essere stato predefinito, mentre è possibile inviare a un oggetto un messaggio che può scegliere di gestire dinamicamente (con respond_to? e method_missing).Questa flessibilità è un aspetto che consente a Ruby di essere utilizzato come lingue specifiche del dominio (DSL) concise.

4

auto - ricevitore oggetto della corrente metodo

"metodo di chiamata" in Ruby si realizza attraverso un meccanismo di messaggio di invio. Così

some_object.some_method(args) 

è una scorciatoia per

some_object.send(:some_method, args) 

Credo che questo è ciò che la citazione si riferisce a: "sé" è l'oggetto a cui è stato inviato il messaggio (o metodo): il ricevitore del metodo attuale.

L'intera cosa di invio di messaggi è parte di ciò che rende Ruby così dinamico. Rende facile per un oggetto definire method_missing per i messaggi che attualmente non gestisce e decidere cosa fare con essi. Rails lo usa molto: ActiveRecord, ad esempio, ha la sintassi "find_by ...", che capisce cosa si vuole dal nome del metodo chiamato/inviato.