Почему Вы не можете просто сделать чего-то как
List GetKRandomFromList(List input, int k)
List ret = new List();
for(i=0;i<k;i++)
ret.Add(input[Math.Rand(0,input.Length)]);
return ret;
, я уверен, что Вы не имеете в виду что-то, что простой, таким образом, можно определить далее?
или
- это просто логический оператор , аналогичный ||
.
Обычный трюк
mysql_query() or die();
может так же хорошо быть написанным
mysql_query() || die();
Здесь происходит то, что оператор «логическое или» (в зависимости от того, что вы выберете) пытается определить, оценивается ли какой-либо из операндов как ИСТИНА. Это означает, что операнды должны быть выражениями, которые могут быть преобразованы в логическое значение.
Итак, причина
bar() or throw new Exception();
недопустима, потому что
(boolean)throw new Exception();
также недопустимо. По сути, процесс создания исключения не генерирует возвращаемое значение для проверки оператором.
Почему bar ()
и bb ()
не генерируют исключения? В PHP всплывают исключения, поэтому нет необходимости генерировать исключение в функции / методе, в которых вы вызываете bar ()
/ bb ()
. Эти исключения могут быть вызваны bar ()
/ bb ()
. Если вы хотите создать другое исключение, вы можете просто сделать:
function foo() {
try {
$bar = bar();
} catch (BarException) {
throw new FooException;
}
}
Я думаю, вы хотите использовать что-то вроде последней структуры, хотя на самом деле нет смысла использовать исключения для этого:
$foo = bar();
if(!$foo){
echo 'We have a problem in here';
}
На комментарий - я не думаю, что вы можете сделать это в одна строка (т.е. без проверки if (! $ foo)
), и я согласен с тем, что метод генерации исключения довольно ужасен. Лично я предпочитаю ясность:
$foo = bar();
if(!$foo){
throw new Exception('We have a problem in here');
}
, но это личное предпочтение. Если вам нужна однострочная функция, я думаю, вам придется пойти с опцией функции генерации исключений.
Я полагаю, что это ограничение, вероятно, связано с особенностями динамической типизации PHP, она может приводить результаты функции вызов условного выражения, но не результаты броска
.