Ruby Language
Implikowane odbiorniki i zrozumienie siebie
Szukaj…
Zawsze istnieje domniemany odbiorca
W Ruby zawsze istnieje niejawny odbiornik wszystkich wywołań metod. Język zachowuje odniesienie do bieżącego domyślnego odbiornika zapisanego w zmiennej self
. Niektóre słowa kluczowe w języku, takie jak class
i module
, zmienią to, na co wskazuje self
. Zrozumienie tych zachowań jest bardzo pomocne w opanowaniu języka.
Na przykład, kiedy po raz pierwszy otwierasz irb
irb(main):001:0> self
=> main
W tym przypadku main
obiektem jest niejawny odbiornik (więcej informacji na temat main
znajduje się na stronie http://stackoverflow.com/a/917842/417872 ).
Możesz zdefiniować metody w domniemanym odbiorniku za pomocą słowa kluczowego def
. Na przykład:
irb(main):001:0> def foo(arg)
irb(main):002:1> arg.to_s
irb(main):003:1> end
=> :foo
irb(main):004:0> foo 1
=> "1"
To zdefiniowało metodę foo na wystąpieniu głównego obiektu działającego w twojej replice.
Zauważ, że zmienne lokalne są wyszukiwane przed nazwami metod, więc jeśli zdefiniujesz zmienną lokalną o tej samej nazwie, jej odwołanie zastąpi odwołanie do metody. Kontynuując z poprzedniego przykładu:
irb(main):005:0> defined? foo
=> "method"
irb(main):006:0> foo = 1
=> 1
irb(main):007:0> defined? foo
=> "local-variable"
irb(main):008:0> foo
=> 1
irb(main):009:0> method :foo
=> #<Method: Object#foo>
method
metody może nadal znaleźć metodę foo
, ponieważ nie sprawdza zmiennych lokalnych, podczas gdy normalne foo
referencyjne tak.
Słowa kluczowe zmieniają niejawny odbiornik
Kiedy definiujesz klasę lub moduł, niejawny odbiornik staje się odniesieniem do samej klasy. Na przykład:
puts "I am #{self}"
class Example
puts "I am #{self}"
end
Wykonanie powyższego kodu spowoduje wydrukowanie:
"I am main"
"I am Example"
Kiedy używać siebie?
Większość kodu Ruby wykorzystuje niejawny odbiornik, więc programiści, którzy są nowicjuszami w Ruby, często nie wiedzą, kiedy używać self
. Praktyczna odpowiedź jest taka, że self
jest używana na dwa główne sposoby:
1. Aby zmienić odbiornik.
Zwykle zachowanie def
w klasie lub module polega na tworzeniu metod instancji. Zamiast tego można zdefiniować metody w klasie.
class Foo
def bar
1
end
def self.bar
2
end
end
Foo.new.bar #=> 1
Foo.bar #=> 2
2. Aby ujednoznacznić odbiornik
Gdy zmienne lokalne mogą mieć taką samą nazwę jak metoda, może być wymagane jednoznaczne określenie odbiorcy w celu ujednoznacznienia.
Przykłady:
class Example
def foo
1
end
def bar
foo + 1
end
def baz(foo)
self.foo + foo # self.foo is the method, foo is the local variable
end
def qux
bar = 2
self.bar + bar # self.bar is the method, bar is the local variable
end
end
Example.new.foo #=> 1
Example.new.bar #=> 2
Example.new.baz(2) #=> 3
Example.new.qux #=> 4
Innym częstym przypadkiem wymagającym ujednoznacznienia są metody kończące się znakiem równości. Na przykład:
class Example
def foo=(input)
@foo = input
end
def get_foo
@foo
end
def bar(input)
foo = input # will create a local variable
end
def baz(input)
self.foo = input # will call the method
end
end
e = Example.new
e.get_foo #=> nil
e.foo = 1
e.get_foo #=> 1
e.bar(2)
e.get_foo #=> 1
e.baz(2)
e.get_foo #=> 2