LINUX.ORG.RU

История изменений

Исправление special-k, (текущая версия) :

У Смоллтока они бы позаимствовали раньше, а сейчас - у языка состоящего из костылей :)

Ничего подобного.

Вот ваш «keyword arguments»

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc") #{'a': 12, 'b': 'abc'}
Внешне похожая на это конструкция была всегда
def a options
  p options
end
a b: 1, c: 2 #{:b=>1, :c=>2}
#при том, что на самом-то деле это хэш, и можно сделать вот так
h = { b: 1, c: 1 }
a h #а в питоне?)
Тут решили чисто рубиновые проблемы: создание локальных переменных для значений хэша и значения по умолчанию. Теперь для этого надо чуть-чуть меньше строчек.

Раньше

class Hash
  def with_defaults(defaults)
    self.merge(defaults) { |key, old, new| old.nil? ? new : old } 
  end
end

def a opts
  opts = opts.with_defaults b: 1, c: 2 # значения по умолчанию
  b = opts[:b]
  c = opts[:c]
  other_opts = opts[:other_opts]
end

Теперь

def a( b: 1, c: 2, **opts )
  other_opts = opts[:other_opts]
end
#и по-прежнему
h = { b: 1, c: 2, other_opts: 3 }
a h
Единственно верно только то, что теперь даже формального повода придраться нет - аргументы в руби сделаны однозначно лучше.

Исходная версия special-k, :

У Смоллтока они бы позаимствовали раньше, а сейчас - у языка состоящего из костылей :)

Ничего подобного.

Вот ваш «keyword arguments»

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc") #{'a': 12, 'b': 'abc'}
Внешне похожая конструкция была всегда
def a options
  p options
end
a b: 1, c: 2 #{:b=>1, :c=>2}
#при том, что на самом-то деле это хэш, и можно сделать вот так
h = { b: 1, c: 1 }
a h #а в питоне?)
Тут решили чисто рубиновые проблемы: создание локальных переменных для значений хэша и значения по умолчанию. Теперь для этого надо чуть-чуть меньше строчек.

Раньше

class Hash
  def with_defaults(defaults)
    self.merge(defaults) { |key, old, new| old.nil? ? new : old } 
  end
end

def a opts
  opts = opts.with_defaults b: 1, c: 2 # значения по умолчанию
  b = opts[:b]
  c = opts[:c]
  other_opts = opts[:other_opts]
end

Теперь

def a( b: 1, c: 2, **opts )
  other_opts = opts[:other_opts]
end
#и по-прежнему
h = { b: 1, c: 2, other_opts: 3 }
a h
Единственно верно только то, что теперь даже формального повода придраться нет - аргументы в руби сделаны однозначно лучше.