Насколько глобальны глобальные переменные в ruby? - PullRequest
1 голос
/ 29 декабря 2010

Вот скрипт ruby:

discarded_rows=-1

def foobar(line)

    if line.match('records discarded: *(\d+)') then
       discarded_rows=$1;
       puts('yepp, I have found: ' + discarded_rows);
    end;

end


foobar('records successful:    99    ');
foobar('records discarded:      2    ');
foobar('records unknown:        8    ');

if discarded_rows != 2 then
   puts("discarded_rows: #{discarded_rows}");
end

И вот что я верю: он объявляет (глобальную) переменную с именем discarded_rows.Затем он объявляет функцию foobar, которая проверяет, соответствует ли переданный аргумент line "удаленным записям * \ d".Если это так, он присваивает количество отброшенных записей (как мне кажется, глобальной) переменной discarded_rows.Если он совпадает, он также печатает «yepp ....» только для того, чтобы убедиться, что совпадение работает.

Функция вызывается с одной строкой, которая должна соответствовать.

Если discarded_rows не равно 2, оно печатает соответствующее значение.

А вот вывод сценария:

yepp, I have found: 2
discarded_rows: -1

Итак, очевидно, совпадение сработало, и, очевидно, discarded_rows недействительно глобальный.Это правильно или я что-то упускаю?

Ответы [ 2 ]

8 голосов
/ 29 декабря 2010

discarded_rows не является глобальной переменной. $discarded_rows будет глобальной переменной.

3 голосов
/ 29 декабря 2010

Забба абсолютно прав. Однако, чтобы уточнить, discarded_rows является локальной переменной. Код на верхнем уровне обрабатывается примерно так, как если бы весь файл выполнялся как метод. Определение нового метода на самом деле происходит гораздо чаще во время выполнения, чем в большинстве языков, до такой степени, что вы можете написать что-то вроде

s = gets
if s =~ /(\d+)/
   i = $1.to_i
   if i < 5
     def less_than_five
       true
     end
   else
     def less_than_five
       false
     end
    end
 else
   def less_than_five
     raise "not a number"
   end
end

p less_than_five

Тело блока def end вводит новую лексическую область видимости, которая не закрывается поверх вмещающей лексической области (локальные элементы в окружающем коде недоступны для тела метода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...