Почему все данные, которые передаются в функцию, «передаются явно»? - PullRequest
3 голосов
/ 18 марта 2012

Данные передаются в функцию «явно», тогда как метод «неявно передается» объекту, для которого он был вызван.

Не могли бы вы объяснить разницу между этими двумя способами передачи данных?Пример в java или c # поможет.

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Язык 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 голос
/ 18 марта 2012

В этом контексте метод может рассматриваться как функция, имеющая доступ к объекту, к которому он привязан.Любые свойства этого объекта могут быть доступны из метода, даже если они не отображаются в сигнатуре функции.Вы не указали язык, но позвольте мне привести пример на 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
...