2013-02-16 2 views
2

변수 바인딩이 무엇을 의미하는지 잘 모르겠다. 이것은 Ruby에만 국한되지 않는 프로그래밍 개념 일 수 있습니다. 거의 대부분의 책에서 그 의미를 알기를 기대하는 기본 개념처럼 보입니다.변수 바인딩

내 이해 지금까지 : Ruby 객체가 인스턴스화 될 때마다 실제로 의미하는 것은 Ruby가이 객체를 지정하기 위해 메모리에 공간을 할당한다는 것입니다. 객체를 변수에 할당하면 실제로 변수에 객체를 저장하지 않고 해당 객체에 대한 참조를 변수에 저장합니다. 나는 바인딩이 변수와 관련된 객체에 "묶여"있는이 개념을 가리킨다 고 생각하지만 이것이 바인딩과 바인딩의 의미를 나타내는 지 완전히 확신 할 수는 없다.

가능하면 간단한 예제를 사용하여 누군가이 설명을 나에게 도와 줄 수 있습니까?

답변

2

두 번째 단락에서 언급 한 개념은 포인터에 관한 것이며 바인딩과 직접 관련이 없습니다.

눈치 채 셨던 것처럼 바인딩은 Ruby에만 국한되지 않습니다. 프로그래밍 언어와 자연어를 포함한 공식적인 언어 처리에 널리 사용되는 용어입니다. 프로그래밍 언어에서 상수라고하는 고유 한 고정 된 의미를 가진 표현이 있고 자연어 고유 명사 (또는 캐주얼 미국인도 이름이라고도 함)입니다. 그 반대는 그 자체로 어떤 것도 언급하지 않지만 어떤 식 으로든 그들의 가치를 배정해야하는 표현입니다. 이것들은 프로그래밍 언어에서는 변수라고하고, 자연 언어에서는 대명사라고합니다.

변수에 값이 할당되지 않은 컨텍스트에서 변수는 사용 가능하지 않은 것으로 간주됩니다. 그렇지 않으면 변수가 바인드됩니다. 다음 식의 변수 x은 자유 다.

x**2 

변수를 바인딩 할 수있는 몇 가지 방법이 있습니다. 한 가지 방법은 과제입니다. 다음에서는 x에 첫 번째 행에 값 3이 할당되어 범위 내에 바인딩됩니다.

x = 3 
x**2 

또 다른 방법은 그것을 계량화하는 것입니다. 다음에서 블록 내의 x은 외부의 x에 바인딩됩니다. 바깥 쪽 x 값은 내부 값 x이됩니다. 한편, 위의 식의 바깥 쪽 x은 결합하지 않는다. proc을 다음과 같이 어떤 값에 대해 호출하면 바인딩이됩니다.

->x{x**2}.call(3) 
+0

설명해 주셔서 감사합니다! 당신이 말한 것을 기반으로, 그것은 변수 바인딩 오른쪽 범위 특정 권리 것 같습니다? 제 말은 변수 바인딩에 관해서 이야기 할 때, 이것을 이해하기 위해 범위를 컨텍스트로 제공해야한다는 것입니다. – wmock

+0

@WillsonMock 맞아. – sawa

1

바인딩에 대해 생각하는 좋은 방법은 컨텍스트를 캡슐화하는 개체입니다. 당신은 binding 키워드를 사용하여 바인딩 개체를 밝힐 수 :

이제
a = 10 # a is defined in the 'main' context 
def get_binding # so is the 'get_binding' method 
    b = 20 
    binding 
end 

n = get_binding #=> #<Binding:0x00...> 

get_binding 이후 반환 된 바인딩 객체는 메소드의 지역 상황뿐만 아니라 주요 맥락에서 아무 것도 포함의 main 컨텍스트 내에서 정의된다. 변수 bmain에서 사용할 수 없으며 aget_binding에서 사용할 수 있습니다.

당신은 eval를 사용하여 바인딩 개체와 상호 작용하여이를 증명할 수 :

a #=> 10 
eval('a', n) #=> undefined local variable or method 'a' for main:Object 

b #=> undefined local variable or method `b' for main:Object 
eval('b', n) #=> 20 # but it is defined within the context the n binding was created. 

그냥 명확하게 -이 예는 단지 배후에 어떤 일이 벌어지는 지 알아 보여준다. 바인딩 객체를 직접 처리해야하는 경우는 거의 없습니다.

루비 모듈, 클래스 및 메소드는 공용 인스턴스 메서드 등을 통해 명시 적으로 표시되지 않는 한 계층 구조보다 하위 계층 구조에있는 객체에 대한 바인딩을 나타냅니다. 그러나 다른 방법은 사용하지 않습니다. 그러나 프로그래밍에 익숙하지 않은 경우에는 이것에 너무 깊이 관여 할 필요가 없습니다.

+0

"변수 b는 main에서 사용할 수 없지만 a는 get_binding에서 사용할 수 있습니다."라는 문구를 알지 못합니다. 범위에 대한 나의 이해를 바탕으로, 변수 a는 get_binding 메소드 내에서 사용할 수 없어야합니다. 또한 eval ('a', n)에 대한 예제를 실행하면 오류가 발생합니다. NameError : 정의되지 않은 로컬 변수 또는 메서드 'a'가 main : Object입니다. 내가 여기서 뭔가를 놓치고 있니? – wmock

+0

아니, 네 말이 맞아. 내 실수 야. 반환되는 바인딩 객체는 해당 컨텍스트에만 국한됩니다 (분명히 자주 사용하지는 않습니다). 좀 더 이해하기 위해 대답을 편집했습니다. –