Изящные способы возвратить несколько значений от функции

вы можете установить прослушиватель щелчков для любого представления, которое вам не нужно, чтобы объявить его отдельным (112)

yourView.setOnClickListener(this);

, и в свой onClick (View v) добавить нужный код всякий раз, когда вы например, щелкните по нужному виду:

if(v==imageView){
 //write your code here 
}
27
задан Peter O. 28 October 2012 в 13:46
поделиться

12 ответов

В значительной степени все влиявшие ML функциональные языки (который является большинством из них) также имеют большую поддержку кортежа, которая делает этот вид вещи тривиальным.

Для C++ мне нравится повышение:: кортеж плюс повышение:: свяжите (или станд.:: tr1, если у Вас есть он)

typedef boost::tuple<double,double,double> XYZ;

XYZ foo();

double x,y,z;
boost::tie(x,y,z) = foo();

или менее изобретенный пример

MyMultimap::iterator lower,upper;
boost::tie(lower,upper) = some_map.equal_range(key);
24
ответ дан user21714 28 November 2019 в 04:49
поделиться

В C++ можно передать контейнер в функцию, таким образом, функция может заполнить ее:

void getValues(std::vector<int>* result){
  result->push_back(2);
  result->push_back(6);
  result->push_back(73);
}

у Вас мог также быть возврат функции интеллектуальный указатель (использование shared_ptr) к vector:

boost::shared_ptr< std::vector<int> > getValues(){
  boost::shared_ptr< std::vector<int> > vec(new std::vector<int>(3));
  (*vec)[0] = 2;
  (*vec)[1] = 6;
  (*vec)[2] = 73;
  return vec; 
}
0
ответ дан Frank 28 November 2019 в 04:49
поделиться

И Lua и CLU (группой Barbara Liskov в MIT) имеют несколько возвращаемых значений для всех функций---, это всегда - значение по умолчанию. Я полагаю, что разработчики Lua были вдохновлены CLU. Мне нравится иметь несколько значений быть значением по умолчанию для вызовов и возвратов; я думаю, что это - очень изящный образ мыслей о вещах. В Lua и CLU этот механизм абсолютно независим от кортежей и/или записей.

портативный ассемблер C - поддержки несколько возвращаемых значений для его собственного соглашения о вызовах, но не для соглашения о вызовах C. Там идея состоит в том, чтобы позволить разработчику компилятора возвратить несколько значений в отдельных аппаратных регистрах вместо того, чтобы иметь необходимость поместить значения в глыбу в памяти и возвратить указатель на ту глыбу (или как в C, сделайте, чтобы вызывающая сторона передала указатель на пустую глыбу).

Как любой механизм, несколькими возвращаемыми значениями можно злоупотребить, но я не думаю, что больше неблагоразумно иметь функцию, возвращают несколько значений, чем это должно иметь структуру, содержат несколько значений.

1
ответ дан Norman Ramsey 28 November 2019 в 04:49
поделиться

Даже если Вы игнорируете замечательное более новое destructuring присвоение , Moss Collum упомянул , JavaScript довольно хорош при возврате нескольких результатов.

function give7and5() {
  return {x:7,y:5};
}

a=give7and5();
console.log(a.x,a.y);

7  5
2
ответ дан Community 28 November 2019 в 04:49
поделиться

Часто в php я буду использовать вход, на который ссылаются:

public function Validates(&$errors=array()) {
   if($failstest) {
      $errors[] = "It failed";
      return false;
   } else {
      return true;
   }
}

, Который дает мне сообщения об ошибках, которые я хочу, не загрязняя возврат bool, таким образом, я могу все еще сделать:

if($this->Validates()) ...
1
ответ дан willoller 28 November 2019 в 04:49
поделиться

Что касается Java, посмотрите Bruce Eckel Взгляды в Java для хорошего решения (стр 621 и следующие).

В сущности, можно определить класс, эквивалентный следующему:

public class Pair<T,U> {
    public final T left;
    public final U right;
    public Pair (T t, U u) { left = t; right = u; }
}

можно затем использовать это в качестве типа возврата для функции с соответствующими параметрами типа:

public Pair<String,Integer> getAnswer() {
    return new Pair<String,Integer>("the universe", 42);
}

После вызова той функции:

Pair<String,Integer> myPair = getAnswer();

можно обратиться к myPair.left и myPair.right для доступа к составляющим значениям.

существуют другие синтаксические сахарные опции, но вышеупомянутое является ключевым пунктом.

4
ответ дан joel.neely 28 November 2019 в 04:49
поделиться

Никто, кажется еще, не упомянул Perl.

sub myfunc {
  return 1, 2;
}
my($val1, $val2) = myfunc();
4
ответ дан Andru Luvisi 28 November 2019 в 04:49
поделиться

Если функция возвращает несколько значений, который является знаком, Вы могли бы свидетельствовать "запах кода" Глыбы Данных . Часто глыбы данных являются примитивными значениями, что никто не думает для превращений в объект, но интересный материал происходит, поскольку Вы начинаете искать поведение для перемещения в новые объекты.

Пишущие крошечные классы помощника могли бы быть дополнительным вводом, но он обеспечивает ясные имена и сильную проверку типа. Разработчики, поддерживающие Ваш код, будут ценить его. И полезные маленькие классы часто выросли используемый в другом коде.

кроме того, если функция возвращает несколько значений, то она могла бы делать слишком много работы. Функция могла быть пересмотрена в два (или больше) небольшие функции?

5
ответ дан Chris Peterson 28 November 2019 в 04:49
поделиться

Пример PHP:

function my_funct() {
    $x = "hello";
    $y = "world";
    return array($x, $y);
}

Затем когда выполнено:

list($x, $y) = my_funct();
echo $x.' '.$y; // "hello world"
7
ответ дан Evan Fosmark 28 November 2019 в 04:49
поделиться

Несколько языков, особенно Lisp и JavaScript, имеют функцию, названную destructuring присвоением, или destructuring связывают. Это - по существу распаковка кортежа на стероидах: вместо того, чтобы ограничиваться последовательностями как кортежи, списки или генераторы, можно распаковать структуры более сложного объекта в операторе присваивания. Для получения дополнительной информации см. здесь для версии или Lisp здесь для (скорее более читаемый) версия .

JavaScript Кроме этого, я обычно не знаю о многих функциях языка контакта с несколькими возвращаемыми значениями. Однако существует несколько определенного использования нескольких возвращаемых значений, которые могут часто заменяться другими функциями языка. Например, если одно из значений является кодом ошибки, оно могло бы быть лучше заменено за исключением.

При создании новых классов для содержания нескольких возвращаемых значений чувствует себя подобно помехе, то, что Вы возвращаете те значения вместе, часто является знаком, что Ваш код будет лучше полный, после того как класс создается. В частности, другие функции, которые имеют дело с теми же данными, могут затем переместиться в новый класс, который может сделать Ваш код легче следовать. Это не универсально верно, но это достойно рассмотрения. (Ответ Cpeterso о глыбах данных выражает это более подробно).

9
ответ дан Moss Collum 28 November 2019 в 04:49
поделиться

я думаю, что Python является самым естественным путем, когда я должен был сделать то же самое в php, единственное должно было перенести возврат в массив. это действительно имеет подобную распаковку все же.

3
ответ дан SilentGhost 28 November 2019 в 04:49
поделиться

c#

public struct tStruct
{
    int x;
    int y;
    string text;
    public tStruct(int nx, int ny, string stext)
    {
         this.x = nx;
         this.y = ny;
         this.text = stext;
    }
}

public tStruct YourFunction()
{
    return new tStruct(50, 100, "hello world");
}

public void YourPrintFunction(string sMessage)
{
    Console.WriteLine(sMessage);
}

в Lua вы вызываете

MyVar = YourFunction();
YourPrintfFunction(MyVar.x);
YourPrintfFunction(MyVar.y);
YourPrintfFunction(MyVar.text);

Output: 50 100 hello world

Paul

0
ответ дан 28 November 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: