【发布时间】:2012-04-03 09:49:08
【问题描述】:
数据“显式”传递给函数,而方法“隐式传递”给调用它的对象。
请您解释一下这两种传递数据的方式之间的区别? java 或 c# 中的示例会有所帮助。
【问题讨论】:
标签: function methods argument-passing implicit
数据“显式”传递给函数,而方法“隐式传递”给调用它的对象。
请您解释一下这两种传递数据的方式之间的区别? java 或 c# 中的示例会有所帮助。
【问题讨论】:
标签: function methods argument-passing implicit
Java 和 Python 语言就是很好的例子来说明这一点。在 Python 中,只要定义了类的方法,就会显式传递对象:
class Example(object):
def method(self, a, b):
print a, b
# The variable self can be used to access the current object
这里,self 对象作为第一个参数显式传递。这意味着
e = Example()
e.method(3, 4)
如果method 是一个函数,则实际上与调用method(e, 3, 4) 相同。
然而,在 Java 中第一个参数没有明确提及:
public class Example {
public void method(int a, int b) {
System.out.println(a + " " + b);
// The variable this can be used to access the current object
}
}
在 Java 中,它是:
Example e = Example();
e.method(3, 4);
实例e 也传递给method,但可以使用特殊变量this 来访问它。
当然,对于函数,每个参数都是显式传递的,因为在函数定义和调用函数的位置都提到了每个参数。如果我们定义
def func(a, b, c):
print a, b, c
然后我们可以使用func(1, 2, 3) 调用它,这意味着所有参数都被显式传递。
【讨论】:
self 是在哪里定义的?会不会是别的名字?你上课后的(object) Example 在做什么?什么时候需要访问当前对象?非常感谢西蒙!
this,但您仍然可以在方法本身中使用它)。对象self 是对象e:我们正在调用e.method(3, 4),这意味着Python 使用参数e 调用method(在方法中:self)、3(a ) 和4 (b)。 (object) 表示类 Example 有 object 作为父类;这与旧样式和新样式类有关(这里没有空间解释)。最后,您可以在类的方法中访问当前对象(如Python中的self)。
在这种情况下,方法可以被认为是一个可以访问它所绑定的对象的函数。这个对象的任何属性都可以从方法中访问,即使它们没有出现在函数的签名中。您没有指定语言,但让我举一个 PHP 的示例,因为它非常流行且易于阅读,即使您不使用它。
编辑:这些语言是在我写完之后添加的;如果需要,也许有人可以将其翻译成其中一种语言。
<?php
/* Explicit passing to a function */
function f($a, b)
{
return $a + b;
}
// f(1, 2) == 3
class C
{
public $a, $b;
/* $a and $b are not in the parameter list. They're accessed via the special $this variable that points to the current object. */
public function m()
{
return $this->a + $this->b;
}
}
$o = new C();
$o->a = 1;
$o->b = 2;
//$o->m() == 3
【讨论】: