为什么传递给函数的所有数据都“明确传递”?

时间:2012-03-18 18:48:50

标签: function methods argument-passing implicit

将数据“显式”传递给函数,而将方法“隐式传递”到调用它的对象。

请问您能解释这两种传递数据的方式之间的区别吗? java或c#中的一个例子会有所帮助。

2 个答案:

答案 0 :(得分:4)

语言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(e, 3, 4)是函数,

实际上与调用method相同。

但是,在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)来调用它,这意味着所有参数都被显式传递。

答案 1 :(得分:1)

在此上下文中,可以将方法视为可以访问其绑定的对象的函数。可以从方法访问此对象的任何属性,即使它们未出现在函数的签名中。你没有指定一种语言,但让我举一个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