Project

General

Profile

Actions

Feature #7748

open

Contextual send

Added by trans (Thomas Sawyer) about 11 years ago. Updated over 3 years ago.

Status:
Open
Target version:
-
[ruby-core:51719]

Description

=begin
If I write a method that uses #send vs. #public_send, I am making an assumption about how that method is invoked. For example, take the simplest form of such a method:

class String
def send_out(op, *a, &b)
send(op, *a, &b)
end
end

This code has a bug in it, in the sense that it can be used to call private string methods. The solution is to use #public_send. In most cases that will be fine. But if anyone tries to reuse the method while extending String themselves, e.g.

class String
def send_out(op, *a, &b)
public_send(op, *a, &b)
end

def some_public_method
  send_out(:some_private_method)
end

private
def some_private_method
end

end

Then it will be a problem b/c it cannot be used on a private supporting method.

So it seems like there should be something like a ((contextual send)) which invokes a send with the same visibility as the parent method is invoked. e.g.

class String
def send_out(op, *a, &b)
contextual_send(op, *a, &b)
end
end

And then all cases will work as expected.
=end

Updated by nobu (Nobuyoshi Nakada) about 11 years ago

#send had been implemented in that manner once, but reverted and #public_send was separated instead.

Updated by trans (Thomas Sawyer) about 11 years ago

Ah, so this has been thought of before. I agree it should not replace behaviour of private #send (although, how much sweeter the syntax if it were called #private_send ?). But as an additional method, it would be useful.

Or was there some reason, other than zonking #send, that made it "bad"?

Updated by ko1 (Koichi Sasada) about 11 years ago

  • Assignee set to matz (Yukihiro Matsumoto)

I think matz tried it.
Matz: Could you give us your knowledge?

Updated by matz (Yukihiro Matsumoto) about 11 years ago

=begin
What I did was allowing ((%send%)) to invoke public method when called without explicit receiver.

And I gave up the idea because (a) it made send behavior more complex, (b) it slightly slowed down #send, (c) it was difficult to implement it in other implementations.

Matz.
=end

Actions #5

Updated by naruse (Yui NARUSE) over 3 years ago

  • Target version deleted (3.0)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0