@AndrewRusinas

Существует ли ЯП с подобным синтаксисом логических операций?

Возник спор с товарищем, что ему в JS не хватает выражений типа:

if (status === 'complete' || 'deleted' || 'updated') { //... }

Вместо:

if (status === 'complete' || status === 'deleted' || нувыпонели) {}

Я сказал, что это нечитаемо и никто не стал бы делать подобный синтаксис. Но вот задумался - а вдруг кто-то всё-таки стал бы?

P.S.
Разумеется, как вариант короткой записи, я предложил

['complete', 'deleted', 'updated'].includes(status)

Но это всё надуманные и искусственные примеры. В реальной жизни, условия в JS могут действительно достигать кошмарных размеров и становиться нечитаемыми, даже если выносить их в переменные, а то и целые функции.

Поэтому хотелось бы обсудить такой вопрос - в каком языке самый крутой синтаксис логических операций? Или он везде одинаковый?
  • Вопрос задан
  • 624 просмотра
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
В C# есть что-то подобное:
if(status is "complete" or "deleted" or "updated") { /*...*/ }
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@taktik
Sr. QA automation | SDET
python:
if status in ['complete', 'deleted', 'updated']:
    # ...
Ответ написан
Комментировать
@ComodoHacker
В C так пишут.
Ответ написан
tundramani
@tundramani
синтаксис языка должен быть как можно проще
чем проще тем лучше

делай так:

let массив_значений = ['complete', 'deleted', 'updated']

let если = function(ключ, массив_значений)
{
return true /false
}

if( если(status, массив_значений) )
{ }
Ответ написан
dollar
@dollar
Делай добро и бросай его в воду.
Если оптимизировать скорость, то нужно использовать силу хеш-таблиц, поиск по которым занимает примерно O(1):
const NEEDED_STATUS = { complete: true, deleted: true, updated: true}
if (NEEDED_STATUS[status]) { /*... */ }

Однако стоит иметь в виду два момента:
  1. Это экономия на спичках.
  2. Прирост производительности начнётся примерно, когда количество вариантов будет больше 4. Реальный прирост будет при очень большом количестве вариантов.

Хеш-таблицы (или возможность из создания) есть практически в любом ЯП.

Если же оптимизировать красоту и понятность кода, то я бы предложил такое:
let is_complete = (status === 'complete');
let is_deleted = (status === 'deleted');
let is_updated = (status === 'updated');
if (is_complete || is_deleted || is_updated) { /*... */ }

При этом общий размер кода вырастет, но само условие станет более компактным и понятным. Кроме того, зачастую вот эти is_что-то нужны в других местах кода, которые тоже будут выглядеть опрятно, и в целом общее количество кода порой может даже уменьшиться.
Этот приём возможен в любом ЯП.
Ответ написан
Комментировать
Jacen11
@Jacen11
['complete', 'deleted', 'updated'].includes(status)

в котлине это будет status in listOf('complete', 'deleted', 'updated')

if (status === 'complete' || 'deleted' || 'updated') { //... }

а это просто бред какой то, эти операции применяются только к булеану, 'deleted' не булеан. Это все равно что требовать чтобы работало "strring" * "string"
Ответ написан
Yury_Komar
@Yury_Komar
VB.NET:
If (New String(){"111",  "222", "333"}).Contains(status) Then
'...
End If


или так:
Select Case status : Case "111", "222", "333"
'...
End Select
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы