لماذا وظائف لا تملك معلمات أنواع الإرجاع، كما تمت معلمات الإدخال؟

StackOverflow https://stackoverflow.com/questions/472129

  •  19-08-2019
  •  | 
  •  

سؤال

وهذا يفرض دائما لنا بالعودة معلمة واحدة في حالة ولست بحاجة للعودة متعددة، أقول قائمة وسلسلة. هذا التقييد ليس هناك في الحجج وظيفة.

هل كانت مفيدة؟

المحلول

وهذه المشكلة هي ما اللغات وظيفية مثل F # هاسكل الخ تحاول معالجتها. والمشكلة هي أن في الأجهزة، تم إرجاع قيمة مقابل وظيفة في الأصل عن طريق تسجيل CPU، لذلك يمكن فقط إرجاع قيمة واحدة. C جملة مرت على هذا الإرث وC ++ (وC #، جافا) رثت أيضا هذا.

نصائح أخرى

إذا كنت تحتاج إلى القيام بذلك في كثير من الأحيان بما فيه الكفاية، ثم إنشاء فئة لمجرد عقد النتيجة والعودة بدلا من ذلك.

وهذا يسمح لك أيضا لتوثيق ما ترجع الدالة بنفس الطريقة التي يتم توثيق المعلمات.

في الواقع، بعض اللغات تفعل ما تريد بالضبط. على سبيل المثال بيثون، والنظر في هذا القانون. تقوم بإرجاع قيم 2: 1 سلسلة وكثافة آخر

>>> def myFunc():
...   string_val = "techmaddy"
...   int_val = 10
...   return string_val, int_val
...
>>>
>>> s, i = myFunc()
>>>
>>> print s
techmaddy
>>>
>>> print i
10

وآمل من شأنه أن يساعد.

وPS: تحت الأغطية، أعتقد بيثون الملاكمة في لائحة وبرنامج الأمم المتحدة للملاكمة ذلك. أنا لا أعرف ذلك جيدا بيثون أن أقول لكم بالضبط ما يفعل.

وأو كائن عودة [] من طريقتك، والقيام

return new Object[] { list, string};

إذا كنت بحاجة إلى أنواع عودة أكثر معلمات، يمكنك إنشاء زوج الطبقات، أو ثلاثية والعودة تلك.

وجافا سكريبت، لحسن الحظ بالنسبة لك، هي لغة ديناميكية. هذا يعني أنه يمكنك بناء أي نوع من الكائن الذي تريد وإعادته. هذا وتجتمع بشكل فعال الاحتياجات الخاصة بك من وجود "معلمات" قيمة الإرجاع، وإن كان ذلك بطريقة بدلا برنامج الأمم المتحدة للtypesafe.

وعلى سبيل المثال:

function stuff() {
    return {
        "foo": "a",
        "bar": "b"
    }
}

var theStuff = stuff();
alert(theStuff.foo + theStuff.bar); // should output "ab"

في طريقة للتعامل مع السلوك عودة تعقيدا هو لتمرير واجهة التي استدعاء الأسلوب. منها مثلا.

public interface Results<R> {
    public void processing(String stage);
    public void success(String mesg, R result);
    public void successes(String mesg, List<R> result);
    public void thrown(Throwable t);
}

public void process(Results<R> results, String text, List<String> data);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top