среда, 10 октября 2012 г.

Ruby

Ruby Комментарии.

# Это одностройчный комментарий.

name = 'Eric' # Это тоже однострочный комментарий.

=begin
Это многострочный
комментарий. Он может
размещаться на нескольких строчках.
=end

Ruby Переменные.

Названия переменных должны начинаться со строчной буквы и всегда быть в нижнем регистре. Слова в переменной могут разделяться символом подчеркивания. Названия переменных могут начинаться с других символов, таких как $ или @, но такой подход к именованию переменных крайне нежелателен.

my_number = 100

Ruby Типы переменных: Числа, Строки, Булевы значения.

my_number =  25 # Переменная содержит число.

my_string = 'Ruby' # Переменная содержит строку с текстом.

my_boolean = true  # Переменная содержит булево значение true.

Ruby Математические операции.

Сложение (+)
Вычитание (-)
Умножение (*)
Деление (/)
Возведение в степень (**)
Деление по модулю с получением остатка (%)

addition = 1 + 2 # Результат: 3
subtraction = 5 - 3 # Результат: 2
multiplication = 2 * 10 # Результат: 20
division = 15 / 3 # Результат: 5
exponentiation = 2 ** 3 # Результат: 8
modulo = 25 % 7 # Результат: 4

Ruby Приведение занчение к строке. to_s (to_string).

value.to_s

Ruby Вывод результата на экран: Print и Puts.

print 'Данный текст будет выведен на экран.'
puts 'Данный текст тоже будет выведен на экран, но после него будет добавлена дополнительная пустая строка.'

Ruby Строки.

'Строку можно писать в одинарных кавычках.'
"Также строку можно писать в двойных кавычках."

Ruby Сложение (объединение) строк.

text = "Вас " + "зовут " + "Виктор."
puts text # Результат: "Вас зовут Виктор."

Ruby Методы работы со строками: Length, Reverse, Upcase, Downcase, Capitalize.

'Сколько символов в данной строке, включая пробел?'.length
# Результат: 49

'Изменить порядок следования символов в данной строке на обратный'.reverse
# Результат: 'йынтарбо ан екортс йоннад в воловмис яинаводелс кодяроп ьтинемзИ'

'сделать все буквы в данной строке заглавными'.upcase
 # Результат: 'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ ЗАГЛАВНЫМИ'

'СДЕЛАТЬ ВСЕ БУКВЫ В СТРОКЕ СТРОЧНЫМИ'.downcase
# Результат: 'сделать все буквы в данной строке строчными'

'виктор - только первая буква станет заглавной'.capitalize
# Результат: 'Виктор - только первая буква станет заглавной'

Методы можно записывать в цепочку.

'К данной строке будет применено 3 метода подряд, согласно порядку их следования'.upcase.downcase.length
# Результат: 79
# Строка приняла следующий вид: 'к данной строке будет применено 3 метода подряд, согласно порядку их следования'

Обычно любой метод при работе со строками не изменяет исходную строку, а создает её копию, которую передаёт далее по коду.

name = 'виктор'

puts name.capitalize
# Результат: 'Виктор'

puts name
# Результат: 'виктор'

Для того, чтобы метод изменил исходную строку, в конец метода добавляется восклицательный знак (!).

puts name.capitalize!
# Результат: 'Виктор'

puts name
# Результат: 'Виктор'

Ruby Методы работы со строками: Split.

split - берет строку, разделяет её на блоки при нахождении символа и помещает блоки в массив.

text = 'Этот текст будет разделен на блоки: один, два, три.'

blocks = text.split(',')

print blocks.length  # Результат: 3 значения в массиве.

Ruby Ввод данных из консоли: gets.chomp

#Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
name = gets.chomp

gets - запрашивает в консоли ввод данных от пользователя. После ввода данных пользователем Ruby автоматически подставляет пустую строку.
chomp - убирает лишнюю пустую строку, подставленную Ruby.

Ruby Подстановка данных в строку: '#{my_variable}'.

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

name = "Viktor"
puts "Вас зовут #{name}!"
# Результат: "Вас зовут Виктор!"

Ruby Ввод данных в программу из консоли: gets.chomp и подстановка данных в строку: '#{my_variable}'

print 'Какое у вас имя?' # Вывод текста на экран.
first_name = gets.chomp # Запрос на ввод данных в консоли и подстановка введенного значения в переменную name.
first_name.capitalize! # Сделать первую букву заглавной.

print 'Какая у вас фамилия?'
last_name = gets.chomp
last_name.capitalize!

print 'В каком городе вы живете?'
city = gets.chomp
city.capitalize!

print 'Из какой вы страны?'
state = gets.chomp
state.upcase! # Сделать все буквы заглавными.

# Подстановка значений из переменных в строку и вывод итогового текста на экран.
puts "Вас зовут #{first_name} #{last_name} и вы из #{city}, #{state}!"

Ruby Условия: if, elsif, else, end и unless.

if 1 < 2
  print 'Этот текст будет выведен на экран, так как 1 меньше, чем 2!'
end

if 1 > 2
  print 'Этот текст не будет выведен на экран, так как 1 меньше, чем 2.'
else
  print 'Это значит, что на экран будет выведен этот текст!'
end

if x < y  # Представим, что x и y это какие-то числа.
  puts "x меньше, чем y!"
elsif x > y
  puts "x больше, чем y!"
else
  puts "x равен y!"
end

print 'Введите число: '
user_number = Integer(gets.chomp)

if user_number < 0
  puts 'Вы ввели отрицательное число!'
elsif user_number > 0
  puts 'Вы ввели положительное число!'
else
  puts 'Вы ввели ноль!"'
end

hungry = false # Это значит, что я не голоден.
unless hungry # Пока не голоден.
  puts "Можно писать программы!"
else # В противном случае.
  puts "Самое время поесть!"
end

Вы можете также использовать тернарный оператор в качестве замены для назначения:

if boolean?
  do_one_thing
else
  do_something_else
end

В этом случаем данное выражение будет выглядеть так:

boolean? ? do_one_thing : do_something_else

Ruby Сравнение значений: ==, !=, >, >=, <, <=.

Равно (==)
Не равно (!=)
Больше (>)
Больше или равно (>=)
Меньше (<)
Меньше или равно (<=)

x = 2
y = 2
if x == y
  print "x равен y!"
end

Помещение результата от сравнения значений в переменную.

test_1 = 77 != 77
# Результат: test_1 = false

test_2 = -4 <= -4
# Результат: test_2 = true

test_3 = -44 < -33
# Результат: test_3 = true

test_4 = 100 == 1000
# Результат: test_4 = false

Ruby Логические булевы опараторы: &&, ||, !.

Логическое И (&&)
Логическое Или (||)
Логическое Не (!)

boolean_and = (77 < 78) && (77 < 77)
# Результат: boolean_and = false

boolean_or = false || (-10 > -9)
# Результат: boolean_or = false

boolean_not = !((700 / 10) == 70)
# Результат: boolean_not = false

Логические операторы можно комбинировать в одном выражении.

boolean_combination = (3 < 4 || false) && (false || true)
# Результат: boolean_not = true

Ruby Проверка нахождения символов в строке: Include?

string_to_check = 'This string has the substring.'

if string_to_check.include? 'substring'
    puts 'Строка содержит данные символы!'
end

Ruby Глобальная замена символов в строке: Gsub.

gsub - сокращение от global substitution, что переводится как глобальная замена.

string_to_check = 'This string has the substring.'

# Замена в строке всех символов s на символы th.
string_to_check.gsub!(/s/, 'th')

puts string_to_check
# Результат: 'Thith thtring hath the thubthtring.'

Ruby Циклы: For.

for num in 1...10
  puts num
end

1...10 - это диапазон значений (range) от 1 до 9. Поскольку в диапазоне указано троеточие (...), то последнее значение исключается из диапазона. Это означает, что будут использоваться все значения по порядку, за исключением последнего.

Если в диапазоне указана две точки (..), то Ruby включит все значения в диапазон.

for num in 1..10
  puts num
end

Ruby Циклы: Loop DO, Break, Next.

i = 0
loop do
  i += 1
  print "#{i}"
  break if i > 5
end

i = 20
loop do
  i -= 1
  next if i % 2 == 0 # Аналог continue в других языках программирования.
  print "#{i}"
  break if i <= 0
end

Ruby Циклы: While, Until.

counter = 1
while counter < 10
  puts counter
  counter = counter + 1
end

counter = 1
until counter > 10
  puts counter
  counter = counter + 1
end

Ruby Инкремент и Декремент: +=, -=, *=, /=.

Ruby не имеет операторов вида ++ и --, имеющихся в других языках программирования. Вместо них используются следующие операторы: +=, -=, *=, /=.

counter += 1 # Эквивалентно counter = counter + 1
counter -= 1 # Эквивалентно counter = counter - 1
counter *= 2 # Эквивалентно counter = counter * 2
counter /= 2 # Эквивалентно counter = counter / 2

Ruby Массивы: Array.

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

my_array = [1, 2, 3, 4, 5]

array_value = my_array[0] # Результат: array_value = 1

array_value = my_array[-1] # Результат: array_value = 5

multi_d_array = [[1,2,3,4],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

multi_d_array_value = multi_d_array[0][1] # Результат: multi_d_array_value = 2

Ruby Добавление элемента в массив: Push и <<.

my_array = [1, 2, 3, 4, 5]

my_array.push(6) # Результат: my_array = [1, 2, 3, 4, 5, 6]

Аналогично можно затолкнуть данные в массив следующим образом:

my_array << 7 << 8 # Результат: my_array = [1, 2, 3, 4, 5, 6, 7, 8]

Ruby Добавление текста к каждому элементу массива: Join.

my_array = [1, 2, 3, 4, 5]

my_array.join(',  ') # Результат (добавление пустых пробелов): [1,   2,   3,   4,   5]

Ruby Преобразования диапазона (range) в массив: to_a.

(0..9).to_a # Результат: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

('a'..'e').to_a # Результат: ["a", "b", "c", "d", "e"]

Ruby Вытаскивание элементов из массива с помощью диапазона.

my_array =["foo", "bar", "baz", "quux"]

my_array[0..2] # Результат: ["foo", "bar", "baz"]

Ruby Перебор массивов в цикле: Each.

2 варианта написания each:

object.each { |item| 
  # Do something 
}

Вместо скобок {} можно испльзовать do.

object.each do |item|
  # Do something
end

Переменная между скобками | | может быть всем, что угодно, это просто место для размещения каждого элемента, используемого внутри цикла each.

array = [1,2,3,4,5]

array.each do |x|
  x += 10
  print "#{x}"
end

Ruby Повтор действий в цикле: Times.

10.times {
  print "Ура!"
}

Ruby Хэш-массивы (ассоциативные массивы): литеральное создание {}.

my_hash = {
  "name" => "Eric",
  "age" => 26,
  "hungry?" => true
}

puts my_hash["name"]
puts my_hash["age"]
puts my_hash["hungry?"]

Как и обычные массивы, Хэш-массивы могут быть вложенными и содержать все, что угодно.

params = {}

params[:user] = {
 :name => "Michael Hartl",
 :email => "mhartl@example.com"
}

params[:user][:email] # Результат: "mhartl@example.com"

Ruby Хэш-массивы: Hash.new.

my_hash = Hash.new

Данная конструкция аналогична

my_hash = {}

Ruby Добавление значение в Хэш-массив.

pets = Hash.new
pets['Stevie'] = 'cat'

puts pets['Stevie']

Можно сделать так:

my_hash = Hash.new('Первый элемент массива.')
puts my_hash[0] # Результат: 'Первый элемент массива.'

Ruby Символы в Хэш-массивах.

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

В Хэш-массивах символы можно использовать в качестве ключей.

user = {
  :name => "Michael Hartl",
  :email => "michael@example.com"
}

user[:name]  # Результат: "Michael Hartl"

Данный код аналогичен следующему коду:

user = {
  "name" => "Michael Hartl",
  "email" => "michael@example.com"
}

user["name"] # Результат: "Michael Hartl

Ruby Циклический перебор значений массивов.

friends = ["Milhouse", "Ralph", "Nelson", "Otto"]

family = {
  "Homer" => "dad",
  "Marge" => "mom",
  "Lisa" => "sister",
  "Maggie" => "sister",
  "Abe" => "grandpa",
  "Santa's Little Helper" => "dog"
}

friends.each { |x| puts "#{x}" }
family.each { |x, y| puts "#{x}: #{y}" }

Ruby Циклический перебор вложенных массивов.

s = [["ham", "swiss"], ["turkey", "cheddar"], ["roast beef", "gruyere"]]

s.each do | x |
  x.each do | y |
    puts y
  end
end

Ruby Циклический перебор Хэш-массивов.

secret_identities = {
  "The Batman" => "Bruce Wayne",
  "Superman" => "Clark Kent",
  "Wonder Woman" => "Diana Prince",
  "Freakazoid" => "Dexter Douglas"
}

hash.each { |key, value|
  puts "#{key}:  #{value}"
}

Ruby Сортировка массивов: Sort.

h = h.sort_by {|a, b| b}

my_array = [3, 4, 8, 7, 1, 6, 5, 9, 2]
my_array.sort! # Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9]

books = [
  "Charlie and the Chocolate Factory",
   "War and Peace",
   "Utopia",
   "A Brief History of Time",
   "A Wrinkle in Time"
]
books.sort!

# Результат:
 [
  "A Brief History of Time",
  "A Wrinkle in Time",
  "Charlie and the Chocolate Factory",
  "Utopia",
  "War and Peace"
]

Ruby Сравнение массивов: <=>.

<=> - это оператор сравнения массивов. Он возвращает:
0 - если первый массив равен второму,
1 - если первый массив больше, чем второй,
-1 - если первый массив меньше, чем второй.

array_1 <=> array_2

array_1 = [1,2,3,4,5]
array_2 = [1,2,3,4,5]
puts array_1 <=> array_2

Ruby Функции и методы.

def welcome
  puts "Welcome to Ruby!"
end

welcome

def enter_number (n)
  puts "#{n} - это число."
end

enter_number (10) # Результат: 10 - это число.

def cube(n)
  return n ** 3
end

output = cube(3)

puts output # Результат: 27

В Ruby скобки у функций не являются обязательными.

Данные записи будут эквивалентны:

stylesheet_link_tag ('blueprint/screen', :media => 'screen')

stylesheet_link_tag  'blueprint/screen', :media => 'screen'

И когда Хэш-массив является последним аргументом функции, то фигурные скобки для него не являются обязательными.

Данные записи будут эквивалентны:

stylesheet_link_tag 'blueprint/screen', {:media => 'screen'}
stylesheet_link_tag 'blueprint/screen',   :media => 'screen'

Если метод возвращает значение true или false, то в конце его имени желательно ставить знак вопроса (?).

def validate? (a)
  if a == 1
    return true
  else
    return false
  end
end

validate? (1)

Ruby Анонимные функции или блоки кода: {}.

Анонимные функции или блоки кода могут быть определены внутри do - end или внутри фигурных скобок { }.

Анонимные функции вызываются сразу и срабатывают только один раз в контексте программы.

1.times do
  puts "I'm a code block!"
end

1.times { puts "As am I!" }

Функции могут принимать блоки в качестве параметров. В этом смысле они похожи на объекты или массивы.

Ruby Классы.

class Person

  attr_accessor :fname, :lname

  def initialize(fname, lname)
    @fname = fname # Это внутренняя переменная экземпляра класса.
    @lname = lname # Это внутренняя переменная экземпляра класса.
  end

  def to_s
    @lname + ", " + @fname
  end

end

Person.new("David", "Thomas")

или просто

human = Person.new

Ключевое слово self будет являться ссылкой на сам объект (как слово this).

Self также может задавать и внутренний метод класса:

class CreateUsers < ActiveRecord::Migration
  def self.down # self делает метод down внутренним методом класса CreateUsers.
    drop_table :users
  end
end

Все методы, написанные в классе после ключевого слова Private, используются только внутри объекта и не предназначены для публичного использования.

class User < ActiveRecord::Base

  private

    def encrypt_password
      self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
      string # Only a temporary implementation!
    end

end

Ruby Наследование классов.

class BigInteger < Number

  def initialize(value)
    @value = value # Это переменная экземпляра класса. То есть внутренняя this или self переменная, как в других языках программирования.
  end

end

Ruby Добавление методов в классы.

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

class String
  # Метод возвращает true, если строка равна себе, но перевернутой.
  def palindrome?
    self == self.reverse
  end
end

"deified".palindrome? #Результат: true

Ruby Добавление методов в классы через модули.

# lib/position_mover.rb
module PositionMover
  def  move_to_position (new_position)
    ...
  end
end

# app/models/subject.rb
class Subject < ActiveRecord::Base
  include PositionMover
end

Ruby Определение класса и суперкласса (родительского класса) объекта: Class и Superclass.

s = 'Это строковый объект'
puts s.class # Результат: String

s = String.new("foobar")
s.class # Результат: String
s.class.superclass # Результат: Object
s.class.superclass.superclass # Результат: BasicObject
s.class.superclass.superclass.superclass # Результат: nil

Ruby Создание Getter и Setter методов.

class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@name} <#{@email}>"
  end
end

attr_accessor :name, :email - создает атрибуты доступа соответствующие имени пользователя и адресу электронной почты. Он создает методы получатель (getter) и установщик (setter), которые позволяют нам получать (get) и назначать (set) переменные экземпляра класса @name и @email.

initialize - специальный метод в Ruby. Этот метод вызывается, когда мы выполняем User.new. Этот метод принимает один аргумент: attributes.

attributes - это переменная, которая имеет значение по умолчанию равное пустому хэшу, так что мы можем определить пользователя без имени или адреса электронной почты (напомним, что хэш-массивы возвращают nil на несуществующие ключи, поэтому attributes[:name] будет nil, если нет :name ключа, и так же для attributes[:email]).

Ruby Загрузка кода из файла.

require './example_user'

example = User.new
example.name = "Example User"
example.email = "user@example.com"
example.formatted_email # Результат: "Example User <user@example.com>"

Или можно записать так:

user = User.new(:name => "Michael Hartl", :email => "mhartl@example.com")
user.formatted_email # Результат: "Michael Hartl <mhartl@example.com>"

Комментариев нет:

Отправить комментарий