2016-01-02 4 views
9

Почему Ruby имеет глобальные переменные, такие как $$?Для чего нужны Ruby globals?

Не удалось получить подобное поведение, указав аксессоры и атрибуты в Kernel?

Следует ли исключать переопределение в подклассах?

+2

Вы спрашиваете конкретно о [специальных глобалах] (http://jimneath.org/2010/01/04/cryptic-ruby-global-variables-and-their-meanings.html), например '$$' и т. Д. или о глобальных переменных вообще? Специальные глобальные переменные являются одним из влияний Ruby, которые исходят от Perl, и есть альтернативные методы получения той же информации ('Process.id' в случае' $$ '), что было бы предпочтительнее в наши дни. – mikej

+0

Глобалы вообще, хотя существование $$, $ 0 и т. Д., Похоже, санкционирует их использование. –

+2

Да, подобное поведение можно было бы получить, определив методы (аксессоры) на ядре, но «похоже», чтобы указать очевидное, не является «тем же». Во-первых, вызовы методов стоят дорого в Ruby, по крайней мере, по сравнению с доступом к глобальной переменной. –

ответ

0

Этот вопрос имеет несколько частей и поэтому ответы.

Q1.

Почему Ruby имеет глобальные переменные, такие как $$?

Ruby занимает от Perl и LISP. Оба имеют глобальные переменные.

Ruby унаследовал философию Perl, имея более чем один способ сделать то же самое. Yukihiro Мацумото - 29 сентября 2003

Q2.

Не удалось получить подобное поведение, указав аксессоры и атрибуты в ядре?

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

Хотя это может быть больше OO, чтобы инкапсулировать их внутри метода класса, тогда вопрос становится более важным для пользователя, простоты или стиля. Имя файла сценария, переданного виртуальной машине, является инвариантом. Как и аргументы командной строки. Существует мало преимуществ, полученных путем абстрагирования доступа к этой ценности с помощью метода. Для этой цели достаточно глобальной переменной и она настолько же легка, насколько это возможно.

Q3.

Это предотвращение переопределения в подклассах?

Ответ на этот вопрос мне неизвестен.

Наконец, мы пришли к тому, что вопрос, заданный в названии:

Что Рубиновые Глобал полезно?

можно проследить присвоения переменных в Ruby, с помощью метода trace_var Ядра:

trace_var :$_, proc {|v| puts "$_ is now '#{v}'" } 
$_ = "hello" 
$_ = ' there' 

Выходов на STDOUT:

$_ is now 'hello' 
$_ is now ' there' 

Можно представить себе приложение, которое имеет какое-либо событие привода изменения переменная с именем $ state, скажем, GUI или канал датчика, где просто отслеживание изменений глобальных переменных устраняет необходимость в программном коде, реализующем практически ту же функцию.

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