如何从单个方法返回两个值?

Jam*_*hon 15 language-agnostic return-value

如果您需要在一个方法中返回两件事,那么最好的方法是什么?

我理解一个方法应该只做一件事的理念,但是说你有一个运行数据库选择的方法,你需要拉两列.我假设您只想遍历数据库结果集一次,但是您想要返回两列值的数据.

我提出的选项:

  1. 使用全局变量来保存退货. 我个人尽力避免使用全局变量.
  2. 传入两个空变量作为参数,然后在方法内部分配变量,现在这是一个空白. 我不喜欢有副作用的方法的想法.
  3. 返回包含两个变量的集合. 这可能会导致令人困惑的代码.
  4. 构建一个容器类来保存双返回. 这比包含其他集合的集合更自我记录,但似乎只是为了返回而创建一个类可能会令人困惑.

Dir*_*irk 15

这与语言无关:在Lisp中,您实际上可以从函数返回任意数量的值,包括(但不限于)none,one,two,......

(defun returns-two-values ()
  (values 1 2))
Run Code Online (Sandbox Code Playgroud)

Scheme和Dylan也是如此.在Python中,我实际上会使用包含2个值的元组

def returns_two_values():
   return (1, 2)
Run Code Online (Sandbox Code Playgroud)

正如其他人指出的那样,您可以使用outC#中的参数返回多个值.在C++中,您将使用引用.

void 
returns_two_values(int& v1, int& v2)
{
    v1 = 1; v2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

在C中,您的方法将指向位置,您的函数应存储结果值.

void 
returns_two_values(int* v1, int* v2)
{
    *v1 = 1; *v2 = 2;
}
Run Code Online (Sandbox Code Playgroud)

对于Java,我通常使用专用类或非常通用的小助手(目前,在我的私有"commons"库中有两个:Pair<F,S>并且Triple<F,S,T>,两者都只是2个resp.3值的简单不可变容器)

  • 不.在C++中,你可以使用类似于`void方法(int&out_arg_1,int和out_arg_2){...}`的东西,这在Java中根本不可能.在Java中没有类似的引用(在C++意义上). (3认同)

Nem*_*emi 14

我会创建数据传输对象.如果它是一组信息(名字和姓氏),我会创建一个Name类并返回它.#4是要走的路.它看起来像前面的更多工作(它是),但后来澄清了它.

如果它是一个记录列表(数据库中的行),我会返回某种类型的Collection.

我绝不会使用全局变量,除非应用程序是微不足道的.


azh*_*lov 12

不是我自己的想法(鲍勃叔叔):

如果这两个变量之间存在凝聚力 - 我听过他说,你就错过了这两个领域的课程.(他对使用长参数列表的函数说了同样的话.)

另一方面,如果没有凝聚力,那么该函数不止一件事.


Bil*_*ill 0

使用 std::vector、QList 或某些托管库容器来保存您想要返回的任意数量的 X:

QList<X> getMultipleItems()
{
  QList<X> returnValue;
  for (int i = 0; i < countOfItems; ++i)
  {
    returnValue.push_back(<your data here>);
  }
  return returnValue;
}
Run Code Online (Sandbox Code Playgroud)