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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow