Приведите пример языков программирования (если есть), где можно записать условный оператор в качестве индекса массива.
Например:
a[1 < 2] = 10; // a[1] -> 10
a[1 > 2] = 10; // a[0] -> 10
- 11,366
- 231
- 2
- 9
-
Кроме с++. – LinuxFan Oct 14 '11 at 08:26
5 Answers
C#
class Foo
{
private int[] _bar;
public Foo(int count = 10)
{
_bar = new int[count];
}
public int this[bool idx]
{
get{return idx ? _bar[0] : _bar[_bar.Length - 1];}//если true, возвращаем первый элемент, иначе последний, можете настроить собственную логику поведения
}
public int this[int idx]
{
get{ return _bar[idx];}
set{ _bar[idx] = value;}
}
}
использование:
Foo f = new Foo();
f[0] = 47;
f[9] = 74;
f[1 < 2].Dump(); //-> 47
f[1 > 2].Dump(); //-> 74
- 12,309
-
хитро! ну формально правильно :-) на яве тоже должен такой механизм работать? – LinuxFan Oct 14 '11 at 10:28
-
В Паскаль/делфи
var a:array[boolean] of integer;
begin
a[1>2] := 3;
a[1<2] := 4;
end;
- 112,121
- 6
- 94
- 160
Во-первых желательно вопрос уточнить. Потому что оператор в русскоязычной литературе по программированию (statement) -- это одно, а операция (operator) -- несколько иное. Если Вы имеете в виду операцию, то исходный пример некорректен. Операция в качестве индекса это
a[<] = 1;
a[>] = 2;
a[==] = 3;
Таких не знаю. Если говорить о примерах a[1 < 2] = 1, то мы имеем значении логического типа в качестве индекса. Там примеры языков уже приведены. Могу добавить haskell, правда с оговоркой, что в языке массивов нет, но вот реализации массивов средствами haskell такое позволяют
let a = array (False, True) [] :: (Array Bool Int)
В результате имеем пустой массив типа Array Bool Int
Если имеется в виду условное выражение (?: в C), то тут речь идёт просто о языках, где есть такие выражения и есть массивы.
- 7,313
- 16
- 14
-
немного неправильно сформулировал, но большинство поняли что я имел ввиду :) – LinuxFan Oct 17 '11 at 05:52
Помимо подавляющего большинства языков, где результат логического выражения неявно приводится к {0, 1}, можно привести пример языка R, где массив булевских переменных используется для выбора значений из массива:
> a <- sample(1:20, 10, T)
> a
[1] 3 1 16 3 13 12 15 4 20 20
> a[a > 10] #выбираем все элементы, которые больше 10
[1] 16 13 12 15 20 20
> a[a %% 2 == 0] #выбираем все четные элементы
[1] 16 12 4 20 20
- 11,683
- 25
- 38
-
1в C# такое тоже возможно=)
public IEnumerable
this[Func predicate] { get{return _bar.Where(predicate);} } использование:
Foo f = new Foo(); f[a => a > 0].Dump(); f[a => a % 2 == 0].Dump();
– Spectre Oct 15 '11 at 06:39
В PHP можно так a['1<2']=10; a['1>2']=10
- 6,158
-
но это уже только визуально условный оператор, а на самом деле - строка. – KoVadim Oct 14 '11 at 10:42
-
есть в php функция eval() - выполняет строку) Пользоватся нада ей тоолько в крайних случаях из-зи соображения безопасности. Но автор задал вопрос- и данный ответ имеет право на существование – Ale_x Oct 14 '11 at 17:22