Я не могу воспроизвести эту проблему, но вы написали, что это довольно неловкий способ, IMO. Вы хотите, чтобы все было Double, поэтому просто сделайте это Double, и тогда код станет намного проще, и вам не понадобится все приведение. pow(x,2)
также является очень дорогим способом вычисления x*x
, поэтому я бы избавился от этого, и я думаю, что код становится намного проще и определенно не имеет проблем с компиляцией.
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.reduce(0, +)
return zip(xs, ys).map { [110]*[110] * $1 }.reduce(0, +) / total
}
Если вы делаете много такого рода кода, вы можете найти расширение sum()
полезным, чтобы сделать код немного понятнее.
extension Sequence where Element: Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.sum()
return zip(xs, ys).map { [111]*[111] * $1 }.sum() / total
}
Это более компактные и универсальные формы ответа Hamish's. Они обрабатывают любую смесь строчных и прописных букв:
read -r -p "Are you sure? [y/N] " response
case "$response" in
[yY][eE][sS]|[yY])
do_something
;;
*)
do_something_else
;;
esac
Или, для Bash >= версии 3.2:
read -r -p "Are you sure? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]
then
do_something
else
do_something_else
fi
Примечание: Если $response
- пустая строка, это приведет к ошибке. Чтобы исправить, просто добавьте кавычки: "$response"
. - Всегда используйте двойные кавычки в переменных, содержащих строки (например: лучше использовать "$@"
вместо $@
).
Или, Bash 4.x:
read -r -p "Are you sure? [y/N] " response
response=${response,,} # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
...
Правка:
В ответ на вашу правку, вот как вы создадите и будете использовать команду confirm
, основанную на первой версии в моем ответе (она будет работать аналогично с двумя другими):
confirm() {
# call with a prompt string or use a default
read -r -p "${1:-Are you sure? [y/N]} " response
case "$response" in
[yY][eE][sS]|[yY])
true
;;
*)
false
;;
esac
}
Чтобы использовать эту функцию:
confirm && hg push ssh://..
или
confirm "Would you really like to do a push?" && hg push ssh://..
y
или Y
, n
или N
Дополнительно: Повторите вопрос, пока утвердить вопрос не будет обеспечен
Дополнительно: Проигнорируйте любой другой ответ
Дополнительно: Выйдите из терминала, если Вы хотите
confirm() {
echo -n "Continue? y or n? "
read REPLY
case $REPLY in
[Yy]) echo 'yup y' ;; # you can change what you do here for instance
[Nn]) break ;; # exit case statement gracefully
# Here are a few optional options to choose between
# Any other answer:
# 1. Repeat the question
*) confirm ;;
# 2. ignore
# *) ;;
# 3. Exit terminal
# *) exit ;;
esac
# REPLY=''
}
Уведомление это также: На последней строке этой функции очищают переменную ОТВЕТА. Иначе, если Вы echo $REPLY
Вы будете видеть, что это все еще установлено, пока Вы не открываете или не закрываете свой терминал или устанавливаете его снова.
Вот примерно тот фрагмент, который вам нужен. Позвольте мне выяснить, как переслать аргументы.
read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt == "y" || $prompt == "Y" || $prompt == "yes" || $prompt == "Yes" ]]
then
# http://stackoverflow.com/questions/1537673/how-do-i-forward-parameters-to-other-command-in-bash-script
else
exit 0
fi
Следите за yes | имя команды здесь
:)
Чтобы избежать явной проверки этих вариантов «да», вы можете использовать оператор регулярного выражения bash '= ~' с регулярное выражение:
read -p "Are you sure you want to continue? <y/N> " prompt
if [[ $prompt =~ [yY](es)* ]]
then
(etc...)
Это проверяет, начинается ли ввод пользователя с «y» или «Y» и сопровождается нулем или более «es».
read -r -p "Are you sure? [Y/n]" response
response=${response,,} # tolower
if [[ $response =~ ^(yes|y| ) ]] || [[ -z $response ]]; then
your-action-here
fi
Добавьте следующее в ваш файл /etc/bashrc. Этот скрипт добавляет резидентную "функцию" вместо псевдонима "confirm".
function confirm( )
{
#alert the user what they are about to do.
echo "About to $@....";
#confirm with the user
read -r -p "Are you sure? [Y/n]" response
case "$response" in
[yY][eE][sS]|[yY])
#if yes, then execute the passed parameters
"$@"
;;
*)
#Otherwise exit...
echo "ciao..."
exit
;;
esac
}
Это не совсем "вопрос да или нет", а просто хак: псевдоним hg push ...
не на hgpushrepo
, а на hgpushrepoconfirmedpush
, и к тому времени, как я смогу все это прописать, левый мозг сделает логический выбор.
Это может быть хаком:
как в вопросе В Unix / Bash, является ли "xargs -p" хорошим способом запросить подтверждение перед выполнением любой команды?
мы можем использовать xargs
, чтобы сделать эту работу:
echo ssh://username@www.example.com//somepath/morepath | xargs -p hg push
конечно, это будет установлено как псевдоним, как hgpushrepo
Пример:
$ echo foo | xargs -p ls -l
ls -l foo?...y
-rw-r--r-- 1 mikelee staff 0 Nov 23 10:38 foo
$ echo foo | xargs -p ls -l
ls -l foo?...n
$