Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 변수 범위 및 바인딩 객체 이해

범위는 모든 Ruby 개발자가 이해해야 하는 중요한 개념입니다.

왜?

많은 오류 메시지와 혼란의 근원이기 때문입니다.

범위란 무엇입니까?

범위는 특정 시점에서 사용할 수 있는 변수를 나타냅니다.

변수의 종류에 따라 범위가 다릅니다.

범위는 매우 좁음(로컬 변수)일 수 있습니다. 또는 매우 넓음(전역 변수) .

상태 돌연변이 및 이름 충돌 문제를 피하기 위해 가능한 가장 좁은 범위를 사용하려고 합니다.

다음은 목록입니다. 범위가 Ruby 코드에 미치는 영향

로컬 변수 범위

지역 변수는 범위가 가장 좁습니다.

특히, 메서드 내부에 정의된 지역 변수는 메서드가 반환된 후 더 이상 존재하지 않습니다.

예시 :

a = 50

def apple
  a = 100

  puts a
end

apple은(는) 어떻게 생각하세요? 인쇄할까요?

여기에 답이 있습니다 :

apple을 호출할 때 항상 100을 인쇄합니다. .

a 메소드 외부에서 정의됨 50으로 a에 영향을 미치지 않습니다. 메서드 내부 변수 .

서로 다른 변수입니다.

스코프를 비누 거품으로 생각할 수 있습니다. …

이 첫 번째 a = 50 가 하나의 거품에 있는 경우 메서드를 호출할 때 ANY 메서드를 호출하면 새로운 EMPTY 거품이 입력됩니다.

새 거품 위에 로컬 변수를 가져오지 않습니다.

그리고 방법이 끝나면...

거품이 터집니다.

거품 안의 변수가 사라지고 액세스할 수 없습니다.

이것이 지역 변수가 작동하는 방식입니다.

인스턴스 변수 범위

인스턴스 변수의 범위가 더 넓습니다.

특히 Ruby 개체 내부에서 데이터를 공유하는 데 사용됩니다.

예시 :

class Fruit
  def more_juice
    @quantity = 100
  end

  def less_juice
    @quantity = 50
  end
end

이 예에서 @quantity more_juice 모두에 대해 동일한 변수입니다. &less_juice 방법.

메소드 간의 공유 가치입니다.

그러나 이 클래스 외부와 다른 Fruit에서도 개체, @quantity 다를 것입니다.

:

orange = Fruit.new
apple  = Fruit.new

orange.more_juice
apple.less_juice

모든 개체에는 고유한 인스턴스 변수 집합이 있습니다.

따라서 이 예에서는 orange @quantity가 됩니다. 100 및 apple @quantity가 됩니다. 50개 중.

사람마다 이름, 나이, 국가 등이 다른 것처럼

블록에서 범위가 작동하는 방식

범위와 관련하여 블록은 매우 흥미롭습니다.

거품 비유를 다시 따르면 블록이 하는 일은 현재 거품에서 로컬 변수를 가져오는 것입니다. .

액세스 및 변경할 수 있습니다.

:

a = []

3.times { a << 1 }

p a
# [1, 1, 1]

하지만...

거품이 계속 터지면서 블록 내부에 생성된 새로운 지역 변수가 제거됩니다.

흥미롭지 않습니까?

다음은 내가 의미하는 바의 예입니다. :

1.times { b = [1,2,3] }

b
# NameError

뿐만 아니라 블록은 생성된 시점의 거품과 함께 이동합니다.

"폐쇄"로 알려진 효과 .

이 "버블"은 소스 코드의 특정 지점에서 액세스할 수 있는 모든 변수의 모음입니다.

개체로 캡슐화된 범위 자체입니다.

이것을 Binding이라고 합니다. 루비에서.

루비 바인딩 사용 방법

이 기사에서 여러분과 공유하고 싶은 또 하나의 개념은 바인딩에 관한 것입니다.

Binding 수업.

:

def banana
  a = 100

  binding
end

banana.class
# Binding

이 바인딩 개체는 거품입니다.

거품 속을 들여다보고 그 안에 무엇이 있는지 볼 수도 있습니다.

:

banana.send(:local_variables)
# [:a]

Rails 스코프는 어떻습니까?

Rails의 범위는 Ruby의 범위와 다릅니다.

그렇다면 Rails의 범위는 무엇입니까?

ActiveRecord로 구성된 사용자 지정 데이터베이스 쿼리의 이름을 지정하는 방법입니다. 방법.

예시 :

class User < ApplicationRecord
  scope(:with_email) { where.not(email: nil) }
end

User.with_email

이것을 Ruby의 범위 개념과 혼동하지 마세요 🙂

요약

Ruby의 범위 및 바인딩 개체에 대해 배웠습니다!

범위는 액세스할 수 있는 변수를 정의합니다. 특정 시점에.

거품과 같습니다. 지역 변수에는 자체 거품이 있고 객체는 인스턴스 변수에 대해 다른 거품을 공유합니다.

읽어주셔서 감사합니다.