Рубрики
Без рубрики

Ломтики Python против Ruby Blocks

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

Пару моих коллег на Python пыталась впечатлить меня сегодня с именем кусочков Python. Как это работает так:

 s = list('helloworld!')
  => ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!']
WORLD = slice(5, 10)
s[WORLD]
 => ['w', 'o', 'r', 'l', 'd']

Таким образом, вы можете иметь собственный индивидуальный механизм нарезки, который вы можете применить к любому списку. Что такое круто. Это побудило меня продемонстрировать, как мы можем сделать то же самое с Ruby. К счастью, в мире RUBY у нас есть блоки, пробки и лямбдас, окончательное воспроизведение, которое позволяет нам растягиваться и прогибать в каждом направлении.

​s = ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!']
  => ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!']
world = proc {|x | x.slice(5, 10)}
world[s]
 => ["w", "o", "r", "l", "d", "!"]

Таким образом, мы можем сделать такие вещи, как:

first = proc { |x| x.slice(0) }
first[s]
=> "h"

Или даже вещи, которые мы не можем сделать с именем нарезки Python, так как он не позволяет нам передавать приемник в качестве аргумента для блока (X в примере ниже)

last = proc {|x| x.slice x.length-1, x.length}
last[%w(dog rabbit fox cat)]
=> ["cat"]

или

median = proc {|x| x.slice(x.length / 2) }
median[%w(dog rabbit cat)]
=> "rabbit"

и, конечно, мы не просто ограничены нарезной массивами,

domain_extractor = proc { |x| x.gsub(/.+@([^.]+).+/, '\1') }
domain_extractor["fred@mydomain.co.uk"]
=> "mydomain"

И поскольку блок – это просто анонимный объект ProC, мы можем использовать его с любым способом, который принимает параметры ProC

email_list = ["fred@mydomain.com", "john@gmail.com", "mary@yahoo.co.uk"]
=> ["fred@mydomain.com", "john@gmail.com", "mary@yahoo.co.uk"]
email_list.map(&domain_extractor)
=> ["mydomain", "gmail", "yahoo"]

Блоки и пробки (A.k.a lambdas) идеально подходят для некоторых быстрых, многоразовых функциональных возможностей или для определения метода полноценного вдумого, но и для более серьезных применений, таких как обратные вызовы и отложенное исполнение. ИМХО, они являются фундаментальной частью того, что делает Ruby такой гибкий и мощный язык. Узнайте их, используйте их, наслаждайтесь ими:)

Оригинал: “https://dev.to/redfred7/–python-slices-vs-ruby-blocks—5h3f”