“или” оператор, не повторяя заболевание левой руки снова

С тех пор, как я начал программировать правильно старое доброе использование VB6 и вплоть до настоящего момента, я часто все еще записываюсь (и просто имейте) этим в программировании:

if x == something or x == somethingelse

Я часто заканчиваю тем, что писал:

if x == something or somethingelse

Только из нетто-процента, какой-либо langauge/languages там поддерживает это?

5
задан Joel Coehoorn 9 December 2011 в 17:39
поделиться

8 ответов

Python делает:

if x in [something, somethingelse]:
    ...

в просто проверяет, возникает ли элемент в данном списке. Аналогичным образом, в Haskell:

if x `elem` [something, somethingelse] then ...

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

11
ответ дан 18 December 2019 в 06:35
поделиться

SQL имеют в оператор: x в (что-то, somethingelse) , и существуют много языков, где можно реализовать что-то подобное.

В c#, например, я использую пользовательский дополнительный метод: , если (x. В ("что-то", "somethingelse"))...

редактирование вот источник моего c# дополнительного метода:

public static bool In<T>(this T item, params T[] test_values) {
  foreach (T test_value in test_values)
  {
    if (test_value.Equals(item))
    {
      return true;
    }
  }

  return false;
}
6
ответ дан 18 December 2019 в 06:35
поделиться

Во многих языках программирования вы можете сделать что-то вроде этого:

myArray[something, somethingElse].Contains(x)

... Но я думаю, что это будет немного хуже.

3
ответ дан 18 December 2019 в 06:35
поделиться

MATLAB имеет пару способов обработки второй формы, которую вы указали выше:

if any(x == [something somethingelse]) ...
%# OR
if ismember(x,[something somethingelse]) ...
1
ответ дан 18 December 2019 в 06:35
поделиться

На языках с оператором «коммутатора» вы можете сделать:

switch (x)
{
    case 1:
    case 2:
    {
      // do whatever
      break;
    }

    default:
    {
        // else case
        break;       
    }
}

Это немного многословна, но в C вы могли скрыть Это в макросе или в C ++ возможно шаблон.

1
ответ дан 18 December 2019 в 06:35
поделиться

Perl: $ foo ~~ ['string', $ номер, QR / Regex /]

0
ответ дан 18 December 2019 в 06:35
поделиться

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

  • Я бы поставил зависимость в «Репозиторий файловой системы» локальный в проект.
  • Я бы объявил этот репозиторий в моем Pom.xml , как это:

     <репозитории>
      <Репозиторий>
       Мой 
       Файл: // $ {bustiр} / my-repo 
      
     
     
  • Я бы просто объявил артефакт без программы , это просто источник неприятностей:

     <зависимость>
       sourceforge.jchart2d 
       jChart2D 
      <Версия> 3.1.0 
     
     

Я не на 100% уверен, что это подойдет вашим потребностям, но я думаю, что это лучшее решение, чем использование системной массы.

Обновление: Я должен был упомянуть, что в моем оригинальном ответе, и я сейчас исправляю. Чтобы установить стороннюю библиотеку в файловом репозитории, используйте Установить: Установить-файл с параметром PlocalReposityPath :

mvn install:install-file -Dfile=<path-to-file> \
                         -DgroupId=<myGroup> \
                         -DartifactId=<myArtifactId> \
                         -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> \
                         -DlocalRepositoryPath=<path-to-my-repo>

Вы можете вставить это, как это в оболочке * NIX Отказ В Windows удалите « \ и положите все на одну строку.

-121--968380-

Если

A in [x, y, z]

считается действительным решением, то функция

in(A, x, y, z)

также должна считаться действительным решением, особенно для языка, которые позволяют оператору перегружать так, чтобы CMP (A, X, Y Z) можно было сопоставлено на обсуждение

A in x y z

до сих пор, насколько оно живут на

if (A == x or y or z).

, как насчет случая

if (A == x and y and z).

, следовательно, мы будем использовать Varargs, функцию, найденную в C, C ++, C # и Java5.

Давайте использовать Java, чтобы проиллюстрировать.

boolean or(String lhs, String... rhs){
  for(String z: rhs){
    if (lhs.equals(z) return true;
  }
  return false;
}

boolean and(String lhs, String... rhs){
  for(String z: rhs){
    if (!lhs.equals(z) return false;
  }
  return true;
}

Varargs позволяют определить одну функцию, которая принимает вариабельное количество аргументов, чтобы вы могли использовать тот же метод для сравнения

or (A, x)
or (A, x, y)
or (A, x, y, z)

, то выше, указано только для сравнения строк, так что нам придется создавать пара методов для каждого типа ARG. Но тогда в Java 5 есть дженерики.

<T extends Comparable<T>>boolean or(T lhs, T... rhs){
  for(T z: rhs){
    if (lhs.compareTo(z)==0) return true;
  }
  return false;
}

<T extends Comparable<T>>boolean and(T lhs, T... rhs){
  for(T z: rhs){
    if (lhs.compareTo(z)!=0) return false;
  }
  return true;
}

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

and(stringA, stringx, stringy)
or(dateA, datex)

Слишком плохо, Java не позволяет оператору перегружать так, чтобы мы могли сделать

stringA && stringx, stringy
dateA || datex, datey, datez

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

Revisit: Тем не менее, пересмотрение в эти часы спустя,

мы могли бы определить класс

public class <T extends Comparable<T>> Comparigator{
  public Comparigator(T lhs){
    this.lhs = lhs;
  }
  final private T lhs;

  static public <T extends Comparable<T>> Comparigator is(T lhs){
    return (T)new Comparigator(lhs);
  }

  public boolean inAny(T... rhs){
    for(T z: rhs){
      if (this.lhs.compareTo(z)==0) return true;
    }
    return false;
  }

  public boolean inAll(T... rhs){
    for(T z: rhs){
      if (this.lhs.compareTo(z)!=0) return false;
    }
    return true;
  }

  public boolean gtAny(T... rhs){
    for(T z: rhs){
      if (this.lhs.compareTo(z)>0) return true;
    }
    return false;
  }

  public boolean gtAll(T... rhs){
    for(T z: rhs){
      if (this.lhs.compareTo(z)<=0) return false;
    }
    return true;
  }
}

сейчас, нам не нужен перегрузка оператора вообще, и мы можем сделать

import Comparigator;
.....

is(A).inAny(x,y,z); // or
is(A).inAll(w,x,y,z); // and

is(B).gtAny(k,l,m);
is(C).gtAll(j,k);

, и мы могли бы расширить его, и мы могли бы сделать INANY, INALL, GTANY , GTALL, LTANY, LTALL и т. Д., Расширяя функциональность сравнения.

0
ответ дан 18 December 2019 в 06:35
поделиться

Язык программирования Icon прекрасно поддерживает эту идиому.Icon был разработан Ральфом Грисволдом, который уже разработал SNOBOL, и вся его оценочная модель построена на успехе или неудаче. Все составляет, и в принципе каждое выражение может дать несколько результатов. Вы можете написать такие вещи, как

if x == (something | somethingelse) then write("Goodie!")

Вот модель оценки:

  1. Сначала вы оцениваете выражение в круглых скобках и получаете что-то
  2. Затем вы сравниваете что-то с x
  3. ] Если они не равны, выражение не выполняется , и механизм оценки автоматически выполняет возврат.
  4. Во время поиска с возвратом вычисление заключенного в скобки выражения возобновляется и снова успешно! На этот раз он производит что-то еще .
  5. Предположим, это сравнение удачно. Затем оценивается тело if , и программа записывает на стандартный вывод.

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

lo <= x < limit

. Это выражение заключено в круглые скобки следующим образом:

(lo <= x) < limit

И поэтому, если lo больше, чем x , выражение в скобках не выполняется, и все это не выполняется. . (Обычное выражение не выполняется, если какая-либо его часть не выполняется.) Но если lo не превышает x , то lo <= x выполняется успешно и возвращает х . Затем, конечно же, машина сравнивает x , и если это удается, все успешно.

Icon был красиво согласованным языком, удивительно простым в использовании и недооцененным.Но он никогда не был хорошо интегрирован с операционной системой, и к тому времени, когда у них была версия, которая хорошо работала с Unix, Icon уже потерял свой шанс получить признание. Но все языковые дизайнеры могут многому научиться, изучая его.

R.I.P.

2
ответ дан 18 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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