Язык программирования для "if object.value == some_value затем object.value = some_other_value" - PullRequest
4 голосов
/ 10 июня 2011

Я много раз задавался вопросом, а если нет, то почему нет, существует идиома / ярлык для следующего псевдокода:

if object.value == some_value then object.value = some_other_value

Например, в JavaScript я иногда пишу:

if (document.getElementById("toggledDiv").style.display == "block") {
    document.getElementById("toggledDiv").style.display = "none";
}

Это кажется довольно утомительным. Есть ли название для этой идиомы, и есть ли более краткий синтаксис для этого в распространенных языках программирования?

Спасибо!

Редактировать : Точнее, я не забочусь о скобках, но о том, что вы должны ссылаться на атрибут хотя бы раз. Я хотел бы иметь что-то подобное (псевдокод):

test ( object.value ):
    if (it > 0) it = 0;
    else it -= 1;

е. g.:

test (document.getElementById("toggledDiv").style.display):
    if (it == "block") it = "none";

где it - ключевое слово, которое ссылается на проверенное свойство. Мне просто интересно, что ни один язык программирования, кажется, не реализовал это.

Upate

Хорошо, пока что я нашел что-то немного короткое, но работает только в JavaScript:

(function(s){
  if(s.display=='block') 
    s.display="none";
  else 
    s.display='block'; 
})(document.getElementById("toggledDiv").style)

Ответы [ 3 ]

1 голос
/ 11 июня 2011

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

operator <T> T toggle(T value, T[] values) {
    for(int i=0; i<values.size(); i++) {
        if(value == values[i]) {
            if(values.size() > (i+1)) {
                return values[i+1]
            } else {
                return values[0]

            }
         }
    }
    error "value $value not found in value list $values"
}

Если мой псевдо-код верен, это позволит вам сделать следующее:

v = true;
v = v toggle [true, false] ;       // v == false
v = v toggle [true, false] ;       // v == true (loops to beginning of list
v = v toggle [false, true, true] ; // v == true, since true is both the 2nd and 3rd elements of the list

Вы также можете две версии:

  • Одна, которая, если значения не указаны в списке, возвращает исходное значение
  • Одна, если значения отсутствуют всписок, выдает ошибку (то, что сделала моя версия)

Первое будет меньше переключения и больше ... то, что вы просили, я думаю.Я основывал код на примере использования переключателя из предыдущей заметки о css / block / none, где переключение является наиболее распространенным поведением.

Если язык поддерживает это, вы можете написать оператор toggle= тоже:

v toggle= ['none', 'block']
1 голос
/ 11 июня 2011

Что ж, в Haskell и других языках FP условные выражения, такие как троичные операторы, являются выражениями первого класса, поэтому вы можете выпустить присвоение,

a = if x == y then x else z

Делая код намного чище.

0 голосов
/ 10 июня 2011

В JavaScript вы можете сделать:

var d = document.getElementById("toggledDiv");
if (d.style.display == "block") d.style.display = "none";
...