Руби — интересный язык. Но когда дело доходит до сравнения его с гигантскими классическими языками, такими как C или Java, он на самом деле совершенно новый. Для тех, кто знаком с этими классическими языками, не так просто понять синтаксис Ruby, хотя его язык так близок к вербальному языку.
Кроме того, из-за его гибкости вы можете не знать, какой символ использовать, или даже не знать, существует ли он. Сегодня мы рассмотрим несколько советов, которые используют ниндзя Ruby для оптимизации своего кода.
Изучив это, мы рекомендуем использовать их в ежедневном кодировании или, по крайней мере, не путаться при чтении кода Ruby от экспертов Ruby.
Начнем?
Основы
Основные сочетания клавиш
Во-первых, в Ruby есть несколько кратких способов создания какого-либо объекта, например [] для создания массива или {} для создания хэша (или блока/процедуры). Кроме этого, мы можем:
Нить
%{} или %Q{} — это разные способы представления строки в двойных кавычках, и они могут хранить интерполяцию строк. Используя этот способ, вам не нужно заботиться о раздражающем символе двойной кавычки ("), как при работе со стандартной строкой и двойной кавычкой:
irb(main):001:0> %{Hi! I am a string!} => "Hi! I am a string!" irb(main):002:0> %Q{Me too! "_"} => "Me too! \"_\"" irb(main):003:0> %{You're 5. I am older than you 2 years old, so I am #{5+2} years old.} => "You're 5. I am older than you 2 years old, so I am 7 years old."
С другой стороны, %q{} эквивалентен строке с одинарными кавычками. Это означает, что вы не можете использовать интерполяцию строк, когда дело доходит до расчета возраста, как в приведенном выше примере.
irb(main):004:0> %q{#{2 + 5} equals to?} => "\#{2 + 5} equals to?"
Множество
%w и %W можно использовать как то, что может делать String#split. Разбивает строку на слова пробелами. Если вы хотите избежать некоторых пробелов, вы можете использовать символ \, например, для экранирования символа кавычки из строки. Разница между %W и %w заключается в том, что %W допускает интерполяцию строк.
irb(main):005:0> %w{Fruits\ I\ like: oranges apple banana} => ["Fruits I like:", "oranges", "apple", "banana"] irb(main):006:0> %W{I\ ate #{1+8}\ apples\ today} => ["I ate", "9 apples today"]
регулярное выражение
Обычно // используется для выражения регулярного выражения, но если вы хотите избежать символа /, вы можете использовать %r, как показано ниже:
irb(main):001:0> %r{%d/%d} => /%d\/%d/
Символ
Как и в приведенном выше примере, мы можем использовать %s для создания символов вместо : или :”” для экранирования специальных символов. Одно замечание: %s не поддерживает интерполяцию строк.
irb(main):002:0> %s{studyId} => :studyId irb(main):003:0> %s{hi:man} => :"hi:man" irb(main):004:0> %s{id#{1+2}} => :"id\#{1+2}" irb(main):005:0> :"id#{1+2}" => :id3
обстрел
Когда текст заключен в обратные кавычки (или обратные кавычки), текст внутри него передается специальной функции с именем Kernel.`. Эта функция выполняет содержимое внутри кавычек, как в команде оболочки, и возвращает строку результатов. Вместо использования обратных кавычек вы можете использовать %x. Он также поддерживает интерполяцию строк.
irb(main):006:0> `echo welcome 2019!` => "welcome 2019!\n" irb(main):007:0> `echo welcome #{2018+1}!` => "welcome 2019!\n" irb(main):010:0> %x{echo welcome #{2018+1}!} => "welcome 2019!\n"
Лямбда-литерал
Это простой способ определить область видимости в Rails с помощью -›:
irb(main):013:0> add = -> (a, b) { a + b } => #<Proc:0x007f80028cce98@(irb):13 (lambda)> irb(main):015:0> add.call(1, 2) => 3
Краткий обзор
Что-то более интересное
Теперь мы дадим вам краткий обзор некоторых приемов Ruby, с которыми вы, возможно, еще не сталкивались, если вы не очень долго кодировали Ruby. Если вы освоите эти приемы, вы обязательно отличите свои способности Ruby от остальных.
Параметр с префиксом *, **
Взгляните на эту функцию:
def my_func a, *b, **c return a, b, c end
В этой функции a является обычным параметром, с b все аргументы передаются функции, кроме a, который будет храниться в b в виде массива. И, наконец, с c, если вы передаете аргументы по типу ключ-значение в конце вызова функции, они будут сохранены в c:
irb(main):001:0> def my_func a, *b, **c irb(main):002:1> return a, b, c irb(main):003:1> end => :my_func irb(main):004:0> my_func 1, 2, 3, 4, a: 5, b: 6 => [1, [2, 3, 4], {:a=>5, :b=>6}] irb(main):005:0>
Обрабатывать объекты как массив
Иногда вам нужно обрабатывать входные данные с помощью гибких типов, может быть, это объект или массив. Обычно вам нужно проверить, массив это или нет. Но, используя этот трюк, вы можете обращаться со своим объектом как с обычным массивом с помощью [*object] или [*array] или Array(что-то).
irb(main):005:0> number = 1 => 1 irb(main):006:0> array = [2, 3, 4] => [2, 3, 4] irb(main):007:0> [*number].each { |s| s } => [1] irb(main):008:0> [*array].each { |s| s } => [2, 3, 4]
Нажмите метод
tap - интересный метод. Он используется для манипуляций с объектами перед их возвратом. tap был создан для доступа к цепочкам методов, он просто позволяет вам что-то делать с объектом внутри блока и всегда возвращать этот блок самому объекту. Итак, код:
def something result = operation do_something_with result result end
можно обратиться:
def something operation.tap do |op| do_something_with op end end
Копировать объекты
Глубокая копия
Когда вы копируете объект, это означает, что вы копируете ссылку на скопированный объект. Как вы видете:
irb(main):009:0> fruits = %w(apple banana orange) => ["apple", "banana", "orange"] irb(main):010:0> new_fruits = fruits => ["apple", "banana", "orange"] irb(main):011:0> fruits.map(&:object_id) => [70109297139200, 70109297139180, 70109297139160] irb(main):012:0> new_fruits.map(&:object_id) => [70109297139200, 70109297139180, 70109297139160] irb(main):013:0> fruits.object_id => 70109297139120 irb(main):014:0> new_fruits.object_id => 70109297139120
Используя класс Marshall, вы можете создать объект глубокой копии:
irb(main):015:0> complete_new_fruits = Marshal.load Marshal.dump(fruits) => ["apple", "banana", "orange"] irb(main):016:0> complete_new_fruits.object_id => 70109305512340 irb(main):017:0> complete_new_fruits.map &:object_id => [70109305512320, 70109305512280, 70109305512260]
Например, если у меня есть массив строк, и я хочу сделать все элементы заглавными. Обычно вы можете написать что-то вроде этого: Использование & для создания процедур
irb(main):018:0> fruits = ['banana', 'apple', 'orange'] => ["banana", "apple", "orange"] irb(main):019:0> fruits.map { |f| f.upcase } => ["BANANA", "APPLE", "ORANGE"]
С оператором & это более элегантно:
irb(main):021:0> fruits.map &:upcase => ["BANANA", "APPLE", "ORANGE"]
Оператор & принимает вызывающую сторону метода (объект Fruit) и вызывает метод to_proc для этого объекта. Если этот объект является символом, функция to_proc создаст процедуру и вызовет метод с именем, соответствующим символу, через метод отправки.
Таким образом, приведенный выше пример эквивалентен:
irb(main):023:0> fruits.map {|f| f.send(:upcase)} => ["BANANA", "APPLE", "ORANGE"]
Теперь вместо вызова метода экземпляра мы можем сделать что-то вроде:
def demo_method(word) word + ' - ' + 'demo' end # Instead of: res = arr.map{|str| demo_method(str)} # We can: res = arr.map(&method(:demo_method))
Вывод
Как видите, язык Ruby во многом похож и отличается. Как и во многих других случаях, чем больше у вас опыта и практики работы с Ruby, тем более опытным разработчиком Ruby вы станете.
И так, чего же ты ждешь? Получить кодирование!
Первоначально опубликовано на pangara.com 26 июля 2018 г.