Я постараюсь дополнить ответ @ProgNoob.
Если вы пришли из таких языков, как C
или C++
, где область видимости создается с использованием блока кода.
{
....
}
И все локальные переменные внутри этой сферы не видны снаружи, но они видны в каждой области, созданной внутри, например:
{
int a = 3;
{
// a is visible inside here
}
// a is visible inside here
...
}
// a is not visible outside the scope
Рубин не обрабатывает вещи одинаково. Когда вы создаете class
, module
или method
, вы создаете совершенно новую область, не получая ничего из верхних областей, как мы видели в C
.
v0 = 0
class SomeClass # Scope gate
v1 = 1
# only v1 is visible here
def some_method # Scope gate
v2 = 2
# only v2 is visible here
end # end of def scope gate
end # end of class scope gate
Чтобы разорвать область применения ворот:
- определения классов с с
Class.new
- определения модуля с
Module.new
- определений методов с
define_method
Предыдущий пример без области видимости ворот
v0 = 0
SomeClass = Class.new do
v1 = 1
# v0 and v1 visible here
define_method(:some_method) do
v2 = 2
# v0, v1 and v2 visible here
end
end
# v0 only visible here
Haha, wow, brainfart ... Вы правы, спасибо! – Dave
Вопрос в том, почему код не работает? а не как заставить его работать? – Nermin
Приведено объяснение причины. – Ilya