<<-оператор на Ruby, где это документируется?

Для управления точностью арифметики с плавающей точкой необходимо использовать java.math. BigDecimal. Читайте потребность в BigDecimal John Zukowski для получения дополнительной информации.

, Учитывая Ваш пример, последняя строка как следовала бы за использованием BigDecimal.

import java.math.BigDecimal;

BigDecimal premium = BigDecimal.valueOf("1586.6");
BigDecimal netToCompany = BigDecimal.valueOf("708.75");
BigDecimal commission = premium.subtract(netToCompany);
System.out.println(commission + " = " + premium + " - " + netToCompany);

Это приводит к следующему выводу.

877.85 = 1586.6 - 708.75

12
задан Mark Amery 23 October 2016 в 22:14
поделиться

5 ответов

Из Язык программирования Ruby :

Здесь Документы

Для длинных строковых литералов может не быть односимвольного разделителя, который можно было бы использовать, не беспокоясь о необходимости не забывать экранирующие символы внутри литерала. Решение этой проблемы в Ruby - позволить вам указать произвольную последовательность символов, которая будет служить разделителем для строки. Этот вид литерала заимствован из синтаксиса оболочки Unix и исторически известен как здесь документ . (Поскольку документ находится прямо здесь, в исходном коде, а не во внешнем файле.)

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

 document = << HERE # Вот как мы начинаем здесь документ
Это строковый литерал.
Он состоит из двух строк и резко заканчивается ...
ВОТ

Интерпретатор Ruby получает содержимое строкового литерала, считывая строку за раз со своего ввода. Однако это не означает, что << должен быть последним в отдельной строке. Фактически, после прочтения содержимого документа здесь, интерпретатор Ruby возвращается к строке, в которой он находился, и продолжает ее анализ. Следующий код Ruby, например, создает строку, объединяя два документа здесь и обычную строку в одинарных кавычках:

 welcome = << HERE + << THERE + "World"
Здравствуйте
ВОТ
Там
ТАМ

<< ЗДЕСЬ в строке 1 заставляет интерпретатор читать строки 2 и 3. А << ТАМ заставляет интерпретатор читать строки 4 и 5. После этих строк были прочитаны, три строковых литерала объединены в один.

Конечный ограничитель здесь документа действительно должен появиться в отдельной строке: за разделителем не может следовать комментарий. Если здесь документ начинается с << , то разделитель должен начинаться в начале строки. Если вместо этого литерал начинается с << - , то перед разделителем может быть пробел. Новая строка в начале здесь документа не является частью литерала, а новая строка в конце документа является. Следовательно, каждый документ здесь заканчивается символом конца строки, за исключением пустого документа здесь, КОНЕЦ

Если вы используете идентификатор без кавычек в качестве терминатора, как в предыдущих примерах, то здесь документ будет вести себя как строка в двойных кавычках для целей интерпретации экранирования обратной косой черты и символа # . Если вы хотите быть очень, очень буквальным и не допускать никаких escape-символов, поместите разделитель в одинарные кавычки. Это также позволяет вам использовать пробелы в вашем разделителе:

 document = << 'ЭТО КОНЕЦ, МОЙ ЕДИНСТВЕННЫЙ ДРУГ, КОНЕЦ'
 .
. здесь много-много текста
. без побега.
 .
ЭТО КОНЕЦ, МОЙ ЕДИНСТВЕННЫЙ ДРУГ, КОНЕЦ

Одиночные кавычки вокруг разделителя намекают, что этот строковый литерал похож на строку в одинарных кавычках. На самом деле такой документ еще строже. Поскольку одинарная кавычка не является разделителем, нет необходимости экранировать одиночную кавычку обратной косой чертой. И поскольку обратная косая черта никогда не нужна как escape-символ, нет необходимости избегать самой обратной косой черты. Следовательно, в этом типе документа здесь обратная косая черта является просто частью строкового литерала.

Вы также можете использовать строковый литерал в двойных кавычках в качестве разделителя для документа здесь. Это то же самое, что и использование одного идентификатора, за исключением того, что в нем разрешены пробелы в разделителе:

 document = << - "# # #" # Это единственное место, где мы можем разместить комментарий
#{title} 

# {title}

# {body} # # #

Обратите внимание, что нет возможности включить комментарий в документ здесь, кроме как в первой строке после токена << и перед началом литерала. Из всех символов # в этом коде один вводит комментарий, три интерполирующих выражения в литерал, а остальные являются разделителем

24
ответ дан 2 December 2019 в 05:15
поделиться

Это Ruby " здесь документ " или синтаксис heredoc. Добавление знака - указывает на отступ.

2
ответ дан 2 December 2019 в 05:15
поделиться

Причина, по которой вы не можете найти документацию по оператору << - , заключается в том, что это не оператор. Это буквальный синтаксис, например ' или ".

В частности, это синтаксис здесь , который является одной из многих синтаксических форм строковых литералов в Ruby. . Здесь документы Ruby похожи на документы POSIX sh , но обработка удаления пробелов отличается: в POSIX sh здесь документы, разделенные << - , только ведущие табуляции удаляются, но они удаляются из содержимого строки, тогда как в Ruby все пробелы удаляются, но только из разделитель .

1
ответ дан 2 December 2019 в 05:15
поделиться

Этот пост расскажет вам все, что вам нужно знать о синтаксисе строки "heredoc". Кроме того, вы можете просмотреть страницу rubydoc для синтаксиса строк.

-1
ответ дан 2 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: