Pet*_*ete 2 syntax perl object member
use strict我是一名 Java/C/C#/python 编码员,正在尝试他的第一个 Perl 脚本,我有一个 Perl OOO 101 问题:需要时访问对象成员的语法是什么?
让我讲一下 Java。我有这个小程序,全部在一个类文件中:
class Dude{
public String name;
public Dude(String name){
this.name = name;
}
public void IntroduceYourself(){
System.out.println("Hi, I'm "+this.name);
}
}
public toy(){
Dude fred = new Dude("Fred");
fred.IntroduceYourself();
}
Run Code Online (Sandbox Code Playgroud)
我的 Ubuntu 机器上的输出:
me@ubuntu01:~/$ java toy
Hi, I'm Fred
me@ubuntu01:~/$
Run Code Online (Sandbox Code Playgroud)
还有什么可以更简单呢?我创建一个Dude对象,然后调用 methodDude.IntroduceYourself()来访问类成员。
好的:我必须做完全相同的事情,但现在是在 Perl (v5.26.1) 中。再次,use strict;是必需的。这是我的悲惨尝试:
#!/usr/bin/perl
use warnings;
use strict;
# Define a "Dude" class
package Dude;
sub new
{
my $class = shift;
my $self = {
_name => shift,
};
bless $self, $class;
return $self;
}
sub IntroduceYourself
{
print("Hi, I'm $object->{name}\n"); # Compilation Error here!
}
my $object = new Dude("Fred");
$object->IntroduceYourself();
Run Code Online (Sandbox Code Playgroud)
在同一台 Ubuntu 机器上的输出:
me@ubuntu01:~/$ ./toyPerl.pl
Global symbol "$Dude" requires explicit package name (did you forget to declare "my $Dude"?) at ./toyPerl.pl line 18.
Execution of ./toyPerl.pl aborted due to compilation errors.
me@ubuntu01:~/$
Run Code Online (Sandbox Code Playgroud)
啊。我一直在阅读一些 Perl 教程,并且看到了有关如何编写该子IntroduceYourself()例程的示例,但没有一个将其use strict作为全局指令。谁能看到我做错了什么吗?
另外:我对 Perl 中所谓的“成员函数”感到非常困惑。在我的 Java 示例中,Dude.IntroduceYourself()被定义为 class 的方法Dude。我打算(如果可能的话)成为Perl 代码中IntroduceYourself()对象/类的函数。Dude但我不清楚如何定义它。我是否误解了 Perl 对象如何处理成员函数?谢谢。
这与 OO 无关,只是 Perl 的正常strict行为。strict强制您声明变量,就像在其他语言中一样。如果没有strict,未声明的对象就是全局对象。$object从未声明过,因此违反了严格要求。
要解决这个问题,$object必须声明。Perl 的this作为第一个参数传递给方法。你需要得到这个论据。Perl 称之为“调用者”。通常它被称为$self.
访问对象成员的语法是什么
Perl 不像 Java 那样有对象成员。Perl 对象只是一个引用。它甚至不需要是哈希引用。$self->{key}只是使用哈希引用,因此密钥必须匹配。$self->{_name}不是$self->{name}。
sub IntroduceYourself {
# Get the invocant off the list of arguments.
my $self = shift;
# Use it as a hash reference with the correct key.
print("Hi, I'm $self->{_name}\n");
}
Run Code Online (Sandbox Code Playgroud)
我打算(如果可能的话)让 IntroduceYourself() 成为 Perl 代码中 Object/Class Dude 的函数。但我不清楚如何定义它。
你做到了。一个类只是一个包。方法只是包中的子例程。该语言不区分子例程和方法,也不区分类和对象方法。这只是你如何使用它们。
#!/usr/bin/perl
use strict;
use warnings;
package Foo {
sub new {
my $class = shift;
my($name) = @_;
return bless { name => $name }, $class;
}
sub hello {
my $self = shift;
print "Hello my name is $self->{name}\n";
}
}
my $foo = Foo->new("Pete");
# Called as an object method.
$foo->hello;
# Called as a subroutine.
# It works, but don't do it; it bypasses inheritance.
Foo::hello($foo);
# Called as a class method.
# It "works", but since the method expects $self to be a
# reference, not a package name, $self->{name} is... it's complicated.
Foo->hello;
Run Code Online (Sandbox Code Playgroud)
Perl 的面向对象非常基础。您可以获得类(通过包)、多重继承(通过@ISA)和方法(通过传入调用者的子例程),仅此而已。没有访问器,没有公共,没有私有,没有成员,甚至没有this。
如果你想要这样,你必须自己编写,或者使用现有的库。如果您想要所有的附加功能和完整的军乐队,请安装Moose。
...使用 strict 作为全局指令...
use strict不是全局的,它是当前范围的局部的。当前范围是整个文件,但您可以将其放在一个块中。
{
# strict is on in this block
use strict;
my $foo = 42;
print "$foo\n";
}
# strict is off everywhere else
$bar = 23;
print "$bar\n";
Run Code Online (Sandbox Code Playgroud)
strict诸如和 之类的东西warnings被称为“pragma”。
请参阅“动态和词法(静态)作用域有什么区别?local() 和 my() 之间?” 。
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |