Send an unknown method call: Difference between revisions
(added php) |
(added objective-c) |
||
Line 16: | Line 16: | ||
name = "foo"; |
name = "foo"; |
||
example[name](5) # => 47</lang> |
example[name](5) # => 47</lang> |
||
=={{header|Objective-C}}== |
|||
<lang objc>#import <Foundation/Foundation.h> |
|||
@interface Example : NSObject { } |
|||
- (NSNumber *)foo; |
|||
@end |
|||
@implementation Example |
|||
- (NSNumber *)foo { |
|||
return [NSNumber numberWithInt:42]; |
|||
} |
|||
@end |
|||
int main (int argc, const char *argv[]) { |
|||
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; |
|||
id example = [[Example alloc] init]; |
|||
SEL selector = @selector(foo); // or = NSSelectorFromString(@"foo"); |
|||
NSLog(@"%@", [example performSelector:selector withObject:nil]); |
|||
[example release]; |
|||
[pool release]; |
|||
return 0; |
|||
}</lang> |
|||
The <code>performSelector: ...</code> methods can only be used with methods with 0 - 2 object arguments, and an object or <code>void</code> return type. For all other calls, one can create an <code>NSInvocation</code> object and invoke it, or directly call one of the <code>objc_msgSend</code> family of runtime functions. |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |
Revision as of 08:47, 28 August 2011
Invoke an object method where the name of the method to be invoked can be generated at run time.
- Cf
JavaScript
String literal "foo" may be replaced by any expression resulting in a string <lang javascript>example = new Object; example.foo = function(x) {
return 42 + x;
};
name = "foo"; example[name](5) # => 47</lang>
Objective-C
<lang objc>#import <Foundation/Foundation.h>
@interface Example : NSObject { } - (NSNumber *)foo; @end
@implementation Example - (NSNumber *)foo {
return [NSNumber numberWithInt:42];
} @end
int main (int argc, const char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
id example = [[Example alloc] init]; SEL selector = @selector(foo); // or = NSSelectorFromString(@"foo"); NSLog(@"%@", [example performSelector:selector withObject:nil]); [example release]; [pool release]; return 0;
}</lang>
The performSelector: ...
methods can only be used with methods with 0 - 2 object arguments, and an object or void
return type. For all other calls, one can create an NSInvocation
object and invoke it, or directly call one of the objc_msgSend
family of runtime functions.
Perl
<lang perl>package Example; sub new {
bless {}
} sub foo {
my ($self, $x) = @_; return 42 + $x;
}
package main; my $name = "foo"; print Example->new->$name(5), "\n"; # prints "47"</lang>
Perl 6
<lang perl6>$object."$methname"(5)</lang>
PHP
<lang php><?php class Example {
function foo($x) { return 42 + $x; }
}
$example = new Example();
$name = 'foo'; echo $example->$name(5), "\n"; // prints "47"
// alternately: echo call_user_func(array($example, $name), 5), "\n"; ?></lang>
Python
String literal "foo" may be replaced by any expression resulting in a string <lang python>class Example(object):
def foo(self, x): return 42 + x
name = "foo" getattr(Example(), name)(5) # => 47</lang>
Ruby
<lang ruby>class Example
def foo 42 end def bar(arg1, arg2, &block) block.call arg1, arg2 end
end
symbol = :foo Example.new.send symbol # => 42 Example.new.send( :bar, 1, 2 ) { |x,y| x+y } # => 3</lang>