Project

General

Profile

Actions

Feature #8827

closed

A method that flips the receiver and the first argument

Added by sawa (Tsuyoshi Sawada) over 10 years ago. Updated about 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:56840]

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 10 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 10 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 Anonymous over 10 years ago

=begin

some_chain_of_operations_that_ends_up_with_an_array.tap(&Hash.method(:[]))

=end

Updated by sawa (Tsuyoshi Sawada) over 10 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 10 years ago

I think this request is mostly a duplicate of #6721.

Updated by sawa (Tsuyoshi Sawada) about 1 year ago

Since then has been introduced, I think using that is more straightforward. I withdraw this feature. Please close it.

Actions #7

Updated by jeremyevans0 (Jeremy Evans) about 1 year ago

  • Status changed from Open to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0