С тех пор, как я начал программировать правильно старое доброе использование VB6
и вплоть до настоящего момента, я часто все еще записываюсь (и просто имейте) этим в программировании:
if x == something or x == somethingelse
Я часто заканчиваю тем, что писал:
if x == something or somethingelse
Только из нетто-процента, какой-либо langauge/languages там поддерживает это?
Python делает:
if x in [something, somethingelse]:
...
в
просто проверяет, возникает ли элемент в данном списке. Аналогичным образом, в Haskell:
if x `elem` [something, somethingelse] then ...
Я полагаю, что это можно сделать на большинстве языков, которые позволяют выражать тип списка.
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;
}
Во многих языках программирования вы можете сделать что-то вроде этого:
myArray[something, somethingElse].Contains(x)
... Но я думаю, что это будет немного хуже.
MATLAB имеет пару способов обработки второй формы, которую вы указали выше:
if any(x == [something somethingelse]) ...
%# OR
if ismember(x,[something somethingelse]) ...
На языках с оператором «коммутатора» вы можете сделать:
switch (x)
{
case 1:
case 2:
{
// do whatever
break;
}
default:
{
// else case
break;
}
}
Это немного многословна, но в C вы могли скрыть Это в макросе или в C ++ возможно шаблон.
Я не удивляюсь, что зависимости системы не добавляются (в конце концов, зависимости с системной областью должны быть явно предусмотрены по определению). На самом деле, если вы действительно не хотите ставить эту зависимость в местном хранилище (например, потому, что вы хотите распространить его как часть вашего проекта), это то, что я бы сделал:
Я бы объявил этот репозиторий в моем Pom.xml
, как это:
<репозитории>
<Репозиторий>
Мой ID>
Файл: // $ {bustiр} / my-repo url>
Репозиторий>
Репозитории>
Я бы просто объявил артефакт без программы
, это просто источник неприятностей:
<зависимость>
sourceforge.jchart2d groupid>
jChart2D Artifactid>
<Версия> 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 удалите « \
и положите все на одну строку.
Если
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 и т. Д., Расширяя функциональность сравнения.
Язык программирования Icon прекрасно поддерживает эту идиому.Icon был разработан Ральфом Грисволдом, который уже разработал SNOBOL, и вся его оценочная модель построена на успехе или неудаче. Все составляет, и в принципе каждое выражение может дать несколько результатов. Вы можете написать такие вещи, как
if x == (something | somethingelse) then write("Goodie!")
Вот модель оценки:
что-то
что-то
с x
что-то еще
. if
, и программа записывает на стандартный вывод. Вот еще один интересный сценарий: каждое сравнение либо успешно, либо неуспешно, и в случае успеха оно возвращает свой правый аргумент. Таким образом, вы можете выполнить проверку границ с помощью
lo <= x < limit
. Это выражение заключено в круглые скобки следующим образом:
(lo <= x) < limit
И поэтому, если lo
больше, чем x
, выражение в скобках не выполняется, и все это не выполняется. . (Обычное выражение не выполняется, если какая-либо его часть не выполняется.) Но если lo
не превышает x
, то lo <= x
выполняется успешно и возвращает х
. Затем, конечно же, машина сравнивает x
Icon был красиво согласованным языком, удивительно простым в использовании и недооцененным.Но он никогда не был хорошо интегрирован с операционной системой, и к тому времени, когда у них была версия, которая хорошо работала с Unix, Icon уже потерял свой шанс получить признание. Но все языковые дизайнеры могут многому научиться, изучая его.
R.I.P.