수색…


항상 암묵적인 수신기가 있습니다.

Ruby에는 항상 모든 메소드 호출을위한 암시 적 리시버가 있습니다. 언어는 self 변수에 저장된 현재 암시 적 수신기에 대한 참조를 유지합니다. classmodule 과 같은 특정 언어 키워드는 self 가리키는 키워드를 변경합니다. 이러한 행동을 이해하면 언어 습득에 매우 유용합니다.

예를 들어, irb 를 처음 열 때

irb(main):001:0> self
=> main

이 경우 main 개체는 암시 적 수신기입니다 ( main 인터페이스에 대한 자세한 내용은 http://stackoverflow.com/a/917842/417872 참조).

def 키워드를 사용하여 내재적 수신자에 대한 메소드를 정의 할 수 있습니다. 예 :

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"

이것은 repl에 실행중인 주 객체의 인스턴스에 foo 메소드를 정의했습니다.

로컬 변수는 메서드 이름보다 먼저 조회되므로 동일한 이름의 로컬 변수를 정의하면 해당 참조가 메서드 참조보다 우선합니다. 앞의 예에서 계속 :

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 방법은 여전히 찾을 수 foo 이 지역 변수를 확인하지 않기 때문에 일반 참조하면서, 방법을 foo 않습니다.

키워드는 암시 적 수신기를 변경합니다.

클래스 나 모듈을 정의 할 때 암시 적 수신기는 클래스 자체에 대한 참조가됩니다. 예 :

puts "I am #{self}"
class Example
  puts "I am #{self}"
end

위의 코드를 실행하면 다음과 같이 인쇄됩니다.

"I am main"
"I am Example"

언제 자기를 사용합니까?

대부분의 Ruby 코드는 암시 적 수신기를 사용하므로 Ruby를 처음 사용하는 프로그래머는 종종 self 을 사용할시기에 대해 혼란스러워합니다. 실질적인 대답은 self 가 두 가지 주요한 방식으로 사용된다는 self 입니다.

1. 수신기를 변경하려면.

일반적으로 클래스 또는 모듈 내부의 def 동작은 인스턴스 메서드를 만드는 것입니다. 셀프를 사용하여 클래스의 메서드를 대신 정의 할 수 있습니다.

class Foo
  def bar
    1
  end

  def self.bar
    2
  end
end

Foo.new.bar #=> 1
Foo.bar #=> 2

2. 수신기의 명확성을 위해

지역 변수가 메소드와 동일한 이름을 가질 수있는 경우 명시적인 수신자가 모호하지 않아야 할 수 있습니다.

예 :

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

모호성을 요구하는 다른 일반적인 경우에는 등호로 끝나는 방법이 있습니다. 예를 들면 :

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
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow