【问题标题】:Why is all data that is passed to a function "explicitly passed"?为什么传递给函数的所有数据都“显式传递”?
【发布时间】:2012-04-03 09:49:08
【问题描述】:

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

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

【问题讨论】:

    标签: function methods argument-passing implicit


    【解决方案1】:

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

    【讨论】:

    • 隐式参数是在定义方法时不需要提及的参数吗?在您的 Python 示例中,对象 self 是在哪里定义的?会不会是别的名字?你上课后的(object) Example 在做什么?什么时候需要访问当前对象?非常感谢西蒙!
    • 隐式参数是在方法定义中未提及的参数(在 Java 中未提及 this,但您仍然可以在方法本身中使用它)。对象self 是对象e:我们正在调用e.method(3, 4),这意味着Python 使用参数e 调用method(在方法中:self)、3a ) 和4 (b)。 (object) 表示类 Exampleobject 作为父类;这与旧样式和新样式类有关(这里没有空间解释)。最后,您可以在类的方法中访问当前对象(如Python中的self)。
    【解决方案2】:

    在这种情况下,方法可以被认为是一个可以访问它所绑定的对象的函数。这个对象的任何属性都可以从方法中访问,即使它们没有出现在函数的签名中。您没有指定语言,但让我举一个 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
    

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多