From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: poffice@blade.nagaokaut.ac.jp Delivered-To: poffice@blade.nagaokaut.ac.jp Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (Postfix) with ESMTP id A61E817DC014 for ; Tue, 17 Nov 2015 10:39:56 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 40000B5D87B for ; Tue, 17 Nov 2015 11:10:24 +0900 (JST) Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 6249318CC7EA for ; Tue, 17 Nov 2015 11:10:24 +0900 (JST) Received: from [221.186.184.76] (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id 9A326120443; Tue, 17 Nov 2015 11:10:23 +0900 (JST) X-Original-To: ruby-core@ruby-lang.org Delivered-To: ruby-core@ruby-lang.org Received: from o10.shared.sendgrid.net (o10.shared.sendgrid.net [173.193.132.135]) by neon.ruby-lang.org (Postfix) with ESMTPS id 3F06A12043F for ; Tue, 17 Nov 2015 11:10:19 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=from:to:references:subject:mime-version:content-type:content-transfer-encoding:list-id; s=smtpapi; bh=OW0PL1kUcs/oyQQiim4eugmTOR0=; b=YEXiSm1HRYNrusoY+X eSzZEsVjaj94jZM7VNNOLSvOCEAzRVE46KUr6GVb1hl4psajWPmLJ8T0UfMKhq+o mUGG/AB+ToO1g1xC2T7+ovLxUHX6xILk963I5QkzAoYcutUYKP+Hh/IRmCVpuvmO 6iAL3YhDndzFDoSl/2R3E0lp8= Received: by filter0439p1mdw1.sendgrid.net with SMTP id filter0439p1mdw1.21619.564A8C871 2015-11-17 02:10:15.014368011 +0000 UTC Received: from herokuapp.com (ec2-54-242-163-42.compute-1.amazonaws.com [54.242.163.42]) by ismtpd0003p1iad1.sendgrid.net (SG) with ESMTP id M7jw017JTMu8b0kUMLLAjQ for ; Tue, 17 Nov 2015 02:10:15.013 +0000 (UTC) Date: Tue, 17 Nov 2015 02:10:15 +0000 From: 6ftdan@gmail.com To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Redmine-MailingListIntegration-Message-Ids: 46162 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 11690 X-Redmine-Issue-Author: danielpclark X-Redmine-Sender: danielpclark X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS4QcLuYSqrGt9vV2yjQcyJDq93YIC9Jb0zgH7 nZ4xprT1Amxu9rFNMviHNzOpMJ/4X5Pn47h11l6wa9y1gJlh79OkLSGxfmfoln6FlqskGmf/9GLATu dHb3OQqjeAMZAHaXXDvlyVMGC6WALMqwC4qw X-ML-Name: ruby-core X-Mail-Count: 71510 Subject: [ruby-core:71510] [Ruby trunk - Feature #11690] Update Hash during multiple assignment X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #11690 has been updated by Daniel P. Clark. Nobuyoshi Nakada wrote: > Just an idea. > > ~~~ruby > class ToBeAssigned > def initialize(obj) > @target = obj > end > def method_missing(m, *args) > @target.__send__(m.to_s.chomp('='), *args) > end > def respond_to_missing?(m) > @target.respond_to?(m.to_s.chomp('=')) > end > end > module Kernel > def to_be_assigned_with > ToBeAssigned.new(self) > end > end > > x = {a: 1, b: 2} > > x.to_be_assigned_with.update, y ,z = {c: 3}, 6, 7 > p x > ~~~ I absolutely love the extensibility of this in that it can be used on any object to allow multiple assignment with any method. Brilliant Nobuyoshi! Now if only the method name wasn't so long ;-) Maybe we could replace `to_be_assigned_with` to `slurp`, `consume`, `devour`, or `injest` ;-) It properly expresses the additive nature of the action. Oooh! Or even `feed_me`. eg) `x.feed_me.update` ... I don't think most of those would make it in as an official method in Ruby though. They're a bit silly. ---------------------------------------- Feature #11690: Update Hash during multiple assignment https://bugs.ruby-lang.org/issues/11690#change-54882 * Author: Daniel P. Clark * Status: Open * Priority: Normal * Assignee: ---------------------------------------- Given that we can assign multiple variables at once ~~~ruby a,b,c = 1,2,3 ~~~ It would be nice to be able to update a Hash during multiple assignment rather than replacing it. Currently ~~~ruby x = {a: 1, b: 2} x, y ,z = {c: 3}, 6, 7 x # => {c: 3} ~~~ What I propose is adding `Hash#update=` to permit updating during multiple assignment. ~~~ruby class Hash def update=(h) update(h) end end x = {a: 1, b: 2} x.update, y ,z = {c: 3}, 6, 7 x # => {a: 1, b: 2, c: 3} ~~~ This would be most useful in scenarios where a method or proc return multiple values. When the method returns the values we don't normally know the key outside where the hash assignment is. ~~~ruby example = proc { [{:hi => :hello}, 5] } hash = {} # Currently in Ruby with an Unknown key multiple assignment isn't an option hash[????], current = example.call # We currently have to two step it result, current = example.call hash.update(result) ~~~ But with `Hash#update=` we don't have to know the key. -- https://bugs.ruby-lang.org/