Nếu $name='name'
tại sao $object_ref->$name
hoạt động nhưng không phải $object_ref->('name')
?Làm thế nào tôi có thể gọi một tên hàm được định nghĩa trong một chuỗi ký tự trong perl?
Trả lời
$obj->$name # Method call with no args
$obj->name # Method call with no args
$obj->$name() # Method call with no args
$obj->name() # Method call with no args
$sub->('name') # Sub call (via ref) with one arg.
sub('name') # Sub call with one arg.
Cú pháp cho các cuộc gọi phương thức là $object->method
hoặc $object->$method
. Tuy nhiên, cú pháp bạn đã cung cấp có thể được sử dụng cho $sub_ref->(@param)
.
Trong Perl, ký hiệu ->
có hai nghĩa. Nếu được theo sau bởi một chủ thể $obj->name
hoặc vô hướng $obj->$name
thì ->
nghĩa là gọi phương thức.
Nếu thay vào đó là ->
Tiếp theo là một cú đúp mở cửa, sau đó nó là một dereference, theo bảng sau:
$obj->(...) # dereference as code, which calls the subroutine
$obj->[...] # dereference as array, which accesses an element
$obj->{...} # dereference as hash, which accesses an element
Khi ->
được dereferencing một giá trị, perl sẽ kiểm tra xem nếu giá trị là hoặc là loại được chỉ định bởi cú đúp hoặc nếu nó có thể bị ép buộc vào loại đó thông qua quá tải. Vì vậy, ->(
trong ví dụ của bạn có nghĩa là perl sẽ cố gắng chuyển đổi $object_ref
thành tham chiếu mã và có thể sẽ không thành công, sẽ xảy ra lỗi.
Nếu ->
là một phương pháp gọi, sau đó perl làm điều gì đó như:
if (reftype $name eq 'CODE') { # if $name is code, ignore $object_ref's type
$name->($object_ref) # call the coderef in $name, with $object_ref
} # followed by any other arguments
elsif (my $code = $object_ref->can($name)) { # otherwise, try to look up the
# coderef for the method named $name in $object_ref's namespace and then
$code->($object_ref) # call it with the object and any other arguments
}
else {die "no method $name on $object_ref"}
Chỉ cần để làm cho mọi việc rõ ràng hơn:
sub foo {"foo(@_)"}
my $foo = \&foo;
say foo 'bar'; # 'foo(bar)'
say $foo->('bar'); # 'foo(bar)'
say 'bar'->$foo; # 'foo(bar)'
và
sub Foo::bar {"Foo::bar(@_)"}
my $obj = bless [] => 'Foo';
my $method = 'bar';
say $obj->bar(1); # Foo::bar($obj, 1)
say $obj->$method(1); # Foo::bar($obj, 1)
- 1. Trong Perl, làm thế nào tôi có thể gọi một phương thức có tên tôi có trong một chuỗi?
- 2. Làm thế nào để gọi một hàm được định nghĩa trong exe của tôi bên trong DLL của tôi?
- 3. Làm thế nào tôi có thể tự động gọi một hàm tạo trong C#?
- 4. Làm thế nào tôi có thể đọc một chuỗi ký tự có dấu cách trong C?
- 5. Làm thế nào tôi có thể tách một chuỗi thành các khối gồm hai ký tự trong Perl?
- 6. Làm thế nào tôi có thể đoán mã hóa của một chuỗi trong Perl?
- 7. Làm thế nào tôi có thể bọc một chuỗi trong Perl?
- 8. Làm thế nào tôi có thể sử dụng một biến như một tên biến trong Perl?
- 9. Làm thế nào tôi có thể phát hiện các ký tự Unicode nhất định trong một chuỗi trong Ruby?
- 10. Làm thế nào tôi có thể chuyển đổi một chuỗi 48 hex thành byte bằng Perl?
- 11. Làm thế nào tôi có thể trích dẫn một chuỗi dài trong Perl?
- 12. trong javascript, làm thế nào tôi có thể nhận được ký tự cuối cùng trong một chuỗi
- 13. Làm thế nào tôi có thể trích xuất các chất nền từ một chuỗi trong Perl?
- 14. Làm thế nào tôi có thể viết một hàm C chung để gọi một hàm Win32?
- 15. Làm thế nào tôi có thể có Perl lấy đầu vào từ STDIN một ký tự cùng một lúc?
- 16. Extract ký tự K trước từ một chuỗi trong Perl
- 17. Làm thế nào tôi có thể tuần tự hóa một đóng cửa trong Perl?
- 18. Làm thế nào bạn có thể loại bỏ các ký tự trùng lặp trong một chuỗi?
- 19. Làm thế nào tôi có thể phát hiện các ký tự được xác định trong một phông chữ?
- 20. Làm thế nào tôi có thể nội suy kết quả của một hàm trong một tài liệu Perl ở đây?
- 21. Làm cách nào để gọi tên hàm được lưu trữ trong băm trong Perl?
- 22. Làm thế nào để có được ký tự ° trong một chuỗi trong python?
- 23. Trong java làm thế nào để có được chuỗi con từ một chuỗi cho đến khi một ký tự c?
- 24. Làm thế nào tôi có thể lặp lại một chuỗi N lần trong Perl?
- 25. Có thể gọi hàm C, được đặt tên là chuỗi?
- 26. Thay thế một ký tự bằng một chuỗi trong LaTeX
- 27. Làm thế nào tôi có thể gọi một hàm có sự chậm trễ trong python?
- 28. hàm gọi lua từ một chuỗi có tên hàm
- 29. Làm thế nào tôi có thể phân bổ trước một chuỗi trong Perl?
- 30. Perl: Sắp xếp các ký tự trong một chuỗi