Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ruby / Ruby-новые грани.doc
Скачиваний:
118
Добавлен:
06.06.2015
Размер:
821.25 Кб
Скачать

4.1 Система именования

Система именований переменных, классов, методов, констант, атрибутов и пр., которая во многих языках присутствует как необязательная к исполнению рекомендация, зафиксирована в Ruby на уровне синтаксиса. Так, имя локальной переменной должно начинаться с маленькой буквы или подчеркивания, аналогично для имен методов. А вот константы и классы должны именоваться обязательно с заглавной буквы. Причем константы принято записывать полностью в верхнем регистре.

Имена глобальных переменных должны начинаться с символа $, имена нестатических атрибутов объекта (т.н. instance variables, переменных экземпляра) должны начинаться с @, а статических атрибутов (т.н. class instance variables) — с @@. Например:

  $logger = nil# Имя глобальной переменной

  classHelloPrinter# Имя класса.

    HELLO_PREFIX = ’Hello, ’    # Имя константы.

  

    @@all_names = Set.new       # Имя статического атрибута.

  

    definitialize(name)# Имя метода и имя параметра.

      @name = name              # Имя атрибута.

      @@all_names << name

    end

  

    def print

      message = HELLO_PREFIX + @name    # Имя локальной переменной.

      $logger.log {

          ’Printing hello for ’ + @name + ’, message: ’ + message

      }

      puts message

    end

  end

На первый взгляд подобная система кажется неудобной и даже неэстетичной. Но это впечатление меняется на противоположное по мере привыкания к языку. Особенно удобно, на мой взгляд, использование префиксов @ для атрибутов объектов.

4.2 Наследие Perl

В начале своего развития Ruby многое позаимствовал из Perl. Сейчас некоторые из этих заимствований вызывают лишь досаду. Например, имена стандартных глобальных переменных Ruby: $0 содержит имя программы, заданное в командной строке интерпретатору, $: содержит список каталогов, в которых Ruby ищет подгружаемые модули, $_ содержит последнюю прочитанную с помощью gets строку и т.д.

Еще одно наследие Perl проявляется в неявном обновлении значений глобальных переменных при выполнении каких-либо операции. Например:

while gets

  if /Ruby/

    print

  end

end

является полностью корректной программой, принцип действия которой основан на том, что результат gets (чтения строки со стандартного ввода) сохраняется в $_. Затем значение $_ используется в поиске регулярного выражения /Ruby/ и, если поиск прошел успешно, $_ распечатывается методом print.

Подобное стремление к компактности Ruby-программ является пережитком прошлого (Perl-стиль), и сейчас подобные конструкции приводят к появлению предупреждений:

> ruby -w find_ruby_substring.rb danger_hello.rb

find_ruby_substring.rb:2: warning: regex literal in condition

и, возможно, будут изъяты из будущих версий языка. Сейчас сравнимая степень компактности достигается другими средствами, более выразительными и лучше воспринимаемыми. Этот же пример может быть переписан как:

print ARGF.grep(/Ruby/)

Неоднозначным, но до сих пор широко используемым наследием Perl является наличие постфиксных условных операторов и оператора unless:

f = some_data.find(pattern)   # find() возвращает nil, если

                                # pattern не найден.

unlessf

  # Выполняется только если f == nil.

  ...

end

# постфиксный if, puts отрабатывает только если f != nil

puts "Found: #{f}"iff

# постфиксный unless, присваивание выполняется только если f == nil

f = SomeData.new unless f       

Без таких операторов вполне можно было бы обойтись:

  f = some_data.find(pattern)

  

  if!f

    # Выполняется только если f == nil.

    ...

  end

  

  if f

    puts "Found: #{f}"

  end

  

  if !f

    f = SomeData.new

  end

но в простых случаях отказ от использования постфиксных условных операторов увеличивает объем кода, поэтому часто постфиксные операторы оказываются очень удобными. К сожалению, при злоупотреблении ими программа быстро утрачивает читабельность, поэтому пользоваться постфиксными конструкциями нужно осторожно.

Соседние файлы в папке Ruby