Пару моих коллег на 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”