Ruby: с нуля – часть 3: переменные, константы и литералы

 

ruby_logoПредыдущая часть – часть 2: классы и объекты.

В Ruby есть пять типов переменных, часть из которых мы кратко рассмотрели в предыдущей части.

Глобальные перменные Ruby

Глобальные переменные начинаются с символа $. Непроинициализированные глобальные переменные имеют значение nil (null, void) и вызывают предупрежение при использовании опции -w.

Примечание: интересное обсуждение nil vs null в английском языке можно найти тут>>>.

Пример использования глобальных переменных в Ruby:

#!/usr/bin/ruby

$global_variable = 10

class Class1
  def print_global
     puts "Global variable in Class1 is #$global_variable"
  end
end

class Class2
  def print_global
     puts "Global variable in Class2 is #$global_variable"
  end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

Результат:

$ ./globals.rb
Global variable in Class1 is 10
Global variable in Class2 is 10

Примечание: в Ruby вы можете получить доступ к значениею любой перменной с помощью символа #.

Переменные экземпляра

Переменные экземпляра начинаются с символа @, например:

#!/usr/bin/ruby

$glob = "global"

class Customer
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
      puts "Global var: #$glob"
    end
end

# Create Objects
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.display_details()
cust2.display_details()

Тут $glob – глобальная переменная, а @cust_id, @cust_name и @cust_addr – переменные объекта (или инстанса класса).

Результат выполнения такого кода:

$ ./instance_var.rb
Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Global var: global
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala
Global var: global

Переменные класса

Переменные класса начинаются с двух символов @, т.е. – @@ и должны быть проинициализированные перед использованием в методах.

Ссылка на непроинициализированную переменную класса вызовет ошибку.

Переменные класса доступны всем потокам класса или модуля, в которых они заданы.

Переназначение данных в такой перменной вызовет предупреждение при использовании опции -w.

Пример:

$ cat class_var.rb
#!/usr/bin/ruby

class Customer

   @@no_of_customers=0

   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end

   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end

    def total_no_of_customers()
       @@no_of_customers += 1
       puts "Total number of customers: #@@no_of_customers"
    end

end

# Create Objects
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.total_no_of_customers()
cust2.total_no_of_customers()

Тут @@no_of_customers является переменной класса. Результат выполнения такого кода:

$ ./class_var.rb
Total number of customers: 1
Total number of customers: 2

Локальные переменные

Локальные переменные начинаются со строчной буквы или символа подчеркивания “_“. Область видимости локальной переменной может ограничиваться классом, модулем, функцией, оператором end или парой фигурных скобок “{}“.

Обращение к непроинициализированной переменной обрабатывается как ее объявление.

В примере выше локальными перменными являются id, name и addr:

...
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
...

Константы в Ruby

Имена констант всегда обозначаются буквами в верхнем регистре.

Область видимости констант, заданных в классе или модуле огранивается этим классом или модулем, тогда как константы заданные вне класса – будут доступны глобально.

Определять константу можно вне методов класса. Обращение к непроинициализированной константе вызовет ошибку, а попытка изменить значение константы вызовет предупреждение.

Пример констант в Ruby:

#!/usr/bin/ruby

class Example

   VAR1 = 100
   VAR2 = 200

   def show
       puts "Value of first Constant is #{VAR1}"
       puts "Value of second Constant is #{VAR2}"
   end

end

# Create Objects
object=Example.new()
object.show

Пример выполнения:

$ ./const.rb
Value of first Constant is 100
Value of second Constant is 200

Примечание: переменные и константы в Ruby неплохо описаны на русском тут>>>.

Псевдопеременные в Ruby

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

  • self: определяет объект, чей метод был вызван;
  • true: представление True;
  • false:представление False;
  • nil: неопределенное значение;
  • __FILE__: имя текущего файла;
  • __LINE__: номер строки в текущем файле.

Базовые литералы в Ruby

1. Целочисленные литералы

Целые числа в Ruby могут иметь значение от -230 до 230-1 и от -262 до 262-1. Такие числа хранятся в объектах класса Fixnum, а большие числа – Bignum.

ПримечаниеFixnum vs Bignum могут быть сравнены с int и long int в Java или C. Подробнее – тут>>>.

Примеры записи целочисленных литералов:

123                  # Fixnum decimal
1_234                # Fixnum decimal with underline
-500                 # Negative Fixnum
0377                 # octal
0xff                 # hexadecimal
0b1011               # binary
?a                   # character code for 'a'
?n                  # code for a newline (0x0a)
12345678901234567890 # Bignum

2. Числа с плавающей точкой

Числа с плавающей точкой являются объектами класса Float и могут иметь такой вид:

123.4                # floating point value
1.0e6                # scientific notation
4E20                 # dot not required
4e+20                # sign before exponential

3. Строковые литералы

Строки в Ruby – это последовательность 8-битных байтов, которые являются объектами класса String. Строки в двойных кавычках позволяют выполнять замену символов в строке и использование обратного слеша. Строки в одинарных кавычках не позволяют выполнять замену, а обратный слеш допустим только в виде “\” или “'“.

Пример:

$ cat string.rb
#!/usr/bin/ruby -w

puts 'escape using "\"';
puts 'That's right';

Результат:

$ ruby string.rb
escape using ""
That's right

Вы можете превратить результат любого выражения в Ruby в строку с помощью последовательности #{ выражение }, например:

#!/usr/bin/ruby -w

puts "Multiplication Value : #{24*60*60}";

Результат:

$ ruby expr.rb
Multiplication Value : 86400

4. Управляющие последовательности

Ниже приведен сисок управляющих последовательностей в Ruby:

Notation

Character represented

n

Newline (0x0a)

r

Carriage return (0x0d)

f

Formfeed (0x0c)

b

Backspace (0x08)

a

Bell (0x07)

e

Escape (0x1b)

s

Space (0x20)

nnn

Octal notation (n being 0-7)

xnn

Hexadecimal notation (n being 0-9, a-f, or A-F)

cx, C-x

Control-x

M-x

Meta-x (c | 0x80)

M-C-x

Meta-Control-x

x

Character x

5. Массивы в Ruby

Для создания массива в Ruby – список объектов записывается в между двумя квадратными скобками “[]” и разделяется запятыми:

#!/usr/bin/env ruby

@element1 = 'First element'

ary = [  "fred", 10, 3.14, @element1, "This is a string", "last element", ]

ary.each do |i|
   puts i
end

Результат:

$ ./array.rb
fred
10
3.14
First element
This is a string
last element

6. Хеши в Ruby

Для создания хеша в Ruby его элементы ключ:значение записываются между парой фигурных скобок “{}” и разделяются запятыми:

#!/usr/bin/env ruby

hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
   print key, " is ", value, "n"
end

Результат:

$ ./hash.rb
red is 3840
green is 240
blue is 15

7. Диапазоны в Ruby

Диапазоны представляют собой последовательность объектов, как правило – чисел. Для создания диапазона можно использовать две точки – “..“, три – “...“, либо использовать метод Range.new.

Диапазоны, созданные с помощью “..” включают в себя последний элемент диапазона. При использовании трех точек – последний элемент будет отброшен. Т.е. – при записи вида (1..5) – вы получите значения 1, 2, 3, 4, 5, а при записи вида (1...5) – только 1, 2 ,3 ,4:

#!/usr/bin/env ruby

@range1 = (1..5)
@range2 = (1...5)

puts "Using double points:"
@range1.each do |element|
    print element, ', '
end
puts nil

puts "Using triple points:"
@range2.each do |element|
    print element, ', '
end
puts nil

Результат:

$ ./range.rb
Using double points:
1, 2, 3, 4, 5,
Using triple points:
1, 2, 3, 4,

Продолжение – часть 4: операторы.