Feature #8827
A method that flips the receiver and the first argument
Description
=begin
If it often happens that we need to pass to a method an argument that is the result of a long chain of operations:
Hash[some_chain_of_operations_that_ends_up_with_an_array] File.read(some_chain_of_operations_that_ends_up_with_a_string) YAML.dump(some_chain_of_operations_that_ends_up_with_an_object) ...
I believe one basic tenet of Ruby is to encourage method chaining, but that practice is discouraged in the examples above. It would be convenient if there is a method (let us call this Object#flip
) that flips the receiver and the first argument and sends the method so that the examples above can be written as follows:
some_chain_of_operations_that_ends_up_with_an_array.flip(Hash, :[]) some_chain_of_operations_that_ends_up_with_a_string.flip(File, :read) some_chain_of_operations_that_ends_up_with_an_object.flip(YAML, :dump) ...
The implementation in Ruby may be as follows:
class Object def flip receiver, method, *rest, &pr receiver.send(method, self, *rest, &pr) end end
It would be good if we can have that as a built-in Ruby method.
=end
Updated by nobu (Nobuyoshi Nakada) over 7 years ago
=begin
You can write as:
some_chain_of_operations_that_ends_up_with_an_array.tap {|ary| Hash[ary]}
some_chain_of_operations_that_ends_up_with_a_string.tap {|path| File.read(path)}
some_chain_of_operations_that_ends_up_with_an_object.tap {|obj| YAML.dump(obj)}
=end
Updated by sawa (Tsuyoshi Sawada) over 7 years ago
nobu, I think you mean tap{|ary| break ...}
, etc. That does not look concise enough for me. It might look like a small difference, but it makes huge difference when you are in the middle of a chain. It saves you from thinking extra things.
Updated by charliesome (Charlie Somerville) over 7 years ago
=begin
some_chain_of_operations_that_ends_up_with_an_array.tap(&Hash.method(:[]))
=end
Updated by sawa (Tsuyoshi Sawada) over 7 years ago
charliesome, that has the same problem as nobu's. It does not return the final result. It gives back the receiver.
Updated by alexeymuranov (Alexey Muranov) over 7 years ago
I think this request is mostly a duplicate of #6721.