Поиск…


Синтаксис

  • "[Строка]"
  • '[Сканирующее значение Unicode]'
  • графемы ([строка])

параметры

параметр подробности
За sprint(f, xs...)
f Функция, которая принимает объект IO качестве первого аргумента.
xs Нулевой или более оставшиеся аргументы переходят к f .

Привет, мир!

Строки в Джулии разделяются с помощью " символа:

julia> mystring = "Hello, World!"
"Hello, World!"

Обратите внимание , что в отличие от некоторых других языков, ' символ не может быть использован вместо. ' определяет буквенный символ ; это тип данных Char и будет хранить только одно сканирующее значение Unicode :

julia> 'c'
'c'

julia> 'character'
ERROR: syntax: invalid character literal

Можно извлекать скалярные значения юникода из строки путем итерации по ней с помощью цикла for :

julia> for c in "Hello, World!"
           println(c)
       end
H
e
l
l
o
,
 
W
o
r
l
d
!

графем

Тип Julia's Char представляет собой скалярное значение Unicode , которое только в некоторых случаях соответствует тому, что люди воспринимают как «характер». Например, одно представление символа é, как и в предыдущем, на самом деле представляет собой комбинацию двух сканирующих значений Unicode:

julia> collect("é")
2-element Array{Char,1}:
 'e'
 '́'

Описание Unicode для этих кодовых точек - «LATIN SMALL LETTER E» и «КОМБИНИРОВАНИЕ ОСТРАЯ АКЦЕНТ». Вместе они определяют один «человеческий» характер, который является символом Юникода, называется графемой . Более конкретно, приложение № Юникод № 29 мотивирует определение кластера графем, поскольку:

Важно понимать, что то, что пользователь считает «символом», основным элементом системы написания языка, может быть не только одной кодовой точкой Юникода. Вместо этого эта базовая единица может состоять из нескольких кодовых точек Unicode. Чтобы избежать двусмысленности использования компьютером символа термина, это называется воспринимаемым пользователем символом. Например, «G» + острый акцент воспринимается пользователем: пользователи считают его единственным символом, но на самом деле представлены двумя кодами Unicode. Эти воспринимаемые пользователем символы аппроксимируются так называемым кластером графем, который можно определить программным путем.

Юлия предоставляет graphemes функционировать перебрать графемы кластеров в строке:

julia> for c in graphemes("résumé")
           println(c)
       end
r
é
s
u
m
é

Обратите внимание, как результат, печатающий каждый символ в отдельной строке, лучше, чем если бы мы повторяли скалярные значения Unicode:

julia> for c in "résumé"
           println(c)
       end
r
e

s
u
m
e

Как правило, при работе с символами в воспринимаемом пользователем смысле более полезно иметь дело с кластерами графем, чем с помощью сканирующих значений Unicode. Например, предположим, что мы хотим написать функцию для вычисления длины одного слова. Наивное решение было бы использовать

julia> wordlength(word) = length(word)
wordlength (generic function with 1 method)

Заметим, что результат противоречит интуиции, когда слово включает кластеры grapheme, которые состоят из нескольких кодовых точек:

julia> wordlength("résumé")
8

Когда мы используем более правильное определение, используя функцию graphemes , получаем ожидаемый результат:

julia> wordlength(word) = length(graphemes(word))
wordlength (generic function with 1 method)

julia> wordlength("résumé")
6

Преобразование числовых типов в строки

Существует множество способов преобразования числовых типов в строки в Julia:

julia> a = 123
123

julia> string(a)
"123"

julia> println(a)
123

Функция string() также может принимать больше аргументов:

julia> string(a, "b")
"123b"

Вы также можете вставить (aka интерполировать) целые числа (и некоторые другие типы) в строки, используя $ :

julia> MyString = "my integer is $a"
"my integer is 123"

Совет по производительности . Вышеупомянутые методы могут быть довольно удобными в разы. Но если вы будете выполнять много и много таких операций, и вас беспокоит скорость выполнения вашего кода, руководство по эффективности Julia рекомендует против этого и вместо этого использует следующие методы:

Вы можете предоставить несколько аргументов print() и println() которые будут работать с ними точно так же, как string() работает с несколькими аргументами:

julia> println(a, "b")
123b

Или, когда вы пишете файл, вы можете аналогичным образом использовать, например

open("/path/to/MyFile.txt", "w") do file
    println(file, a, "b", 13)
end

или же

file = open("/path/to/MyFile.txt", "a")
println(file, a, "b", 13)
close(file)

Это быстрее, потому что они избегают необходимости сначала формировать строку из заданных частей, а затем выводить ее (либо на консольный дисплей, либо на файл), а вместо этого просто выводить различные фрагменты.

Кредиты: Ответ основан на SO Вопрос Каков наилучший способ преобразования Int в строку в Julia? с Answer by Michael Ohlrogge и вход от Fengyang Wang

Строковая интерполяция (значение вставки, заданное переменной в строку)

В Julia, как и во многих других языках, можно интерполировать, вставив значения, определенные переменными в строки. Для простого примера:

n = 2
julia> MyString = "there are $n ducks"
"there are 2 ducks"

Мы можем использовать другие типы, кроме числовых, например

Result = false
julia> println("test results is $Result")
test results is false

Вы можете иметь несколько интерполяций в заданной строке:

MySubStr = "a32"
MyNum = 123.31
println("$MySubStr  ,   $MyNum")

Интерполяция производительности подсказка довольно удобна. Но, если вы собираетесь делать это много раз очень быстро, это не самый эффективный. Вместо этого см. Преобразование числовых типов в строки для предложений, когда производительность является проблемой.

Использование sprint для создания строк с функциями ввода-вывода

Строки могут быть выполнены из функций, которые работают с объектами IO , используя функцию sprint . Например, функция code_llvm принимает объект IO в качестве первого аргумента. Как правило, он используется как

julia> code_llvm(STDOUT, *, (Int, Int))

define i64 @"jlsys_*_46115"(i64, i64) #0 {
top:
  %2 = mul i64 %1, %0
  ret i64 %2
}

Предположим, мы хотим, чтобы этот вывод был как строка. Тогда мы можем просто сделать

julia> sprint(code_llvm, *, (Int, Int))
"\ndefine i64 @\"jlsys_*_46115\"(i64, i64) #0 {\ntop:\n  %2 = mul i64 %1, %0\n  ret i64 %2\n}\n"

julia> println(ans)

define i64 @"jlsys_*_46115"(i64, i64) #0 {
top:
  %2 = mul i64 %1, %0
  ret i64 %2
}

Преобразование результатов «интерактивных» функций, таких как code_llvm в строки, может быть полезно для автоматического анализа, например, проверка того, может ли сгенерированный код регрессировать.

Функция sprint - это функция более высокого порядка, которая в качестве первого аргумента возвращает функцию, действующую на объекты IO . За кулисами он создает IOBuffer в ОЗУ, вызывает данную функцию и берет данные из буфера в объект String .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow