
def my_method(argument1, argument2, opts = {}) opts[:value] ||= 1 end
def my_method(argument1, argument2, value: 1, *a, **kw) # assign away end
module A def self.prepended(mod) puts "#{self} prepended to #{mod}" end end module Enumerable prepend A end # => prints "A prepended to Enumerable"
%i[one one-hundred\ one] #=> [:one, :"one-hundred one"]
%w[one one-hundred\ #{2 * 10}] #=> ["one", "one-hundred 20"]
Customer = Struct.new(:name, :address, :zip) sasha = Customer.new("Sasha Gerrand", "1 Kent St, Sydney NSW", 2000) sasha.to_h[:address] #=> "1 Kent St, Sydney NSW"
Current idiom:
module Enumerable def filter_map(&block) map(&block).compact end end
New style:
class Enumerator::Lazy def filter_map Lazy.new(self) do |yielder, *values| result = yield *values yielder << result if result end end end (1..Float::INFINITY).lazy.filter_map{|i| i*i if i.even?}.first(5) # => [4, 16, 36, 64, 100]
Enumerator#size
(1..100).to_a.permutation(4).size # => 94109400 loop.size # => Float::INFINITY (1..100).drop_while.size # => nil
Range#size
(10..20).size #=> 11
th = Thread.new do Thread.handle_interrupt(RuntimeError => :never) { begin # You can write resource allocation code safely. Thread.handle_interrupt(RuntimeError => :immediate) { # ... } ensure # You can write resource deallocation code safely. end } end Thread.pass # ... th.raise "stop"