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{x**2} 

С другой стороны, внешний 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 контексте, возвращаемый объект привязки включает в себя все в пределах локального контекста метода, а также основного контекста. Переменная b не доступна в main, а a - в get_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. 

Просто чтобы прояснить - это пример как раз показывает, что происходит за кулисами. Вы очень редко, если вообще когда-либо, должны иметь дело непосредственно с привязанными объектами.

Модули, классы и методы Ruby раскрывают свои привязки к объектам, расположенным ниже иерархии, чем они, но не наоборот, если они явно не обнаружены с помощью методов публичных экземпляров и т. Д. Это немного упрощает, но в этом нет необходимости слишком углубляться в это, если вы новичок в программировании.

+0

Я не уверен, что получаю следующее утверждение: «Переменная b недоступна в основном, а a доступна в get_binding». Исходя из моего понимания сферы действия, переменная a не должна быть доступна в методе get_binding. Кроме того, когда я выполнил ваш пример для eval ('a', n), я получил ошибку: NameError: неопределенная локальная переменная или метод 'a' для main: Object. Я что-то упустил? – wmock

+0

Нет, вы правы - моя ошибка. Возвращаемый объект привязки является локальным только для его контекста (очевидно, я не часто их использую). Я отредактировал ответ, чтобы иметь больше смысла. –

Смежные вопросы