Szukaj…


Składnia

  • "[strunowy]"
  • „[Wartość skalarna Unicode]”
  • grafemy ([ciąg])

Parametry

Parametr Detale
Dla sprint(f, xs...)
f Funkcja, która jako pierwszy argument przyjmuje obiekt IO .
xs Zero lub więcej pozostałych argumentów do przekazania do f .

Witaj świecie!

Ciągi znaków w Julii są rozdzielane za pomocą symbolu " :

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

Zauważ, że w przeciwieństwie do niektórych innych języków, zamiast tego nie można użyć symbolu ' . ' definiuje literał znakowy ; jest to typ danych Char i będzie przechowywać tylko jedną wartość skalarną Unicode :

julia> 'c'
'c'

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

Można wyodrębnić wartości skalarne Unicode z łańcucha, iterując go za pomocą pętli for :

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

Graphemes

Typ Char Julii reprezentuje wartość skalarną Unicode , która tylko w niektórych przypadkach odpowiada temu, co ludzie postrzegają jako „postać”. Na przykład jedna reprezentacja znaku é, tak jak w CV, jest w rzeczywistości kombinacją dwóch wartości skalarnych Unicode:

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

Opisy Unicode tych punktów kodowych to „LATIN SMALL LETTER E” i „COMBINING ACUTE ACCENT”. Razem definiują pojedynczą „ludzką” postać, która jest terminem Unicode, zwanym grafemem . Mówiąc dokładniej, załącznik nr 29 w Unicode motywuje definicję klastra grafemu, ponieważ:

Ważne jest, aby uznać, że to, co użytkownik uważa za „znak” - podstawową jednostkę systemu pisania dla języka - może nie być pojedynczym punktem kodu Unicode. Zamiast tego ta podstawowa jednostka może składać się z wielu punktów kodu Unicode. Aby uniknąć dwuznaczności przy użyciu komputerowego terminu znak, jest to tak zwany znak postrzegany przez użytkownika. Na przykład „G” + ostry akcent to znak postrzegany przez użytkownika: użytkownicy uważają go za pojedynczy znak, ale w rzeczywistości reprezentowany jest przez dwa punkty kodu Unicode. Te znaki postrzegane przez użytkownika są aproksymowane przez tak zwany klaster grafemiczny, który można określić programowo.

Julia udostępnia funkcję graphemes do iteracji po klastrach grafemu w ciągu:

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

Zauważ, że wynik, wypisanie każdego znaku w osobnej linii, jest lepszy niż gdybyśmy iterowali wartości skalarne Unicode:

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

s
u
m
e

Zazwyczaj podczas pracy ze znakami w sensie postrzeganym przez użytkownika bardziej przydatne jest radzenie sobie z klastrami grafemów niż z wartościami skalarnymi Unicode. Załóżmy na przykład, że chcemy napisać funkcję obliczającą długość pojedynczego słowa. Naiwnym rozwiązaniem byłoby użycie

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

Zauważamy, że wynik jest sprzeczny z intuicją, gdy słowo obejmuje klastry grafem, które składają się z więcej niż jednego punktu kodowego:

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

Kiedy użyjemy bardziej poprawnej definicji, używając funkcji graphemes , otrzymamy oczekiwany wynik:

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

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

Konwertuj typy liczbowe na ciągi

Istnieje wiele sposobów konwersji typów liczbowych na ciągi w Julii:

julia> a = 123
123

julia> string(a)
"123"

julia> println(a)
123

Funkcja string() może również przyjmować więcej argumentów:

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

Możesz także wstawić (czyli interpolować) liczby całkowite (i niektóre inne typy) do ciągów za pomocą $ :

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

Wskazówka dotycząca wydajności: powyższe metody mogą być czasami wygodne. Ale jeśli będziesz wykonywać wiele takich operacji i martwisz się szybkością wykonywania kodu, przewodnik wydajności Julia odradza to, a zamiast tego opowiada się za poniższymi metodami:

Możesz podać wiele argumentów dla print() i println() które będą działać na nich dokładnie tak, jak string() działa na wielu argumentach:

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

Lub, pisząc do pliku, możesz podobnie użyć np

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

lub

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

Są one szybsze, ponieważ unikają konieczności utworzenia łańcucha z danych elementów, a następnie wyprowadzenia go (do wyświetlacza konsoli lub pliku), a zamiast tego po prostu wyprowadzają kolejno różne elementy.

Kredyty: Odpowiedź na podstawie SO Pytanie Jaki jest najlepszy sposób przekonwertowania Int na ciąg znaków w Julii? z odpowiedzią Michaela Ohlrogge i wkładem Fengyanga Wanga

Interpolacja łańcucha (wstaw wartość zdefiniowaną przez zmienną do łańcucha)

W Julii, podobnie jak w wielu innych językach, można interpolować, wstawiając wartości zdefiniowane przez zmienne do ciągów. Dla prostego przykładu:

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

Możemy używać innych typów niż numeryczne, np

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

Możesz mieć wiele interpolacji w ramach danego ciągu:

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

Interpolacja końcówki wydajności jest dość wygodna. Ale jeśli zamierzasz robić to wiele razy bardzo szybko, nie jest to najbardziej wydajne. Zamiast tego zobacz Konwertuj typy liczbowe na ciągi znaków, aby uzyskać sugestie, gdy problemem jest wydajność.

Używanie sprintu do tworzenia ciągów za pomocą funkcji IO

Za pomocą funkcji sprint można tworzyć łańcuchy z funkcji, które działają z obiektami IO . Na przykład funkcja code_llvm akceptuje obiekt IO jako pierwszy argument. Zwykle jest używany jak

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

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

Załóżmy, że zamiast tego chcemy, aby ten wynik był ciągiem. Wtedy możemy po prostu zrobić

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
}

Konwersja wyników funkcji „interaktywnych”, takich jak code_llvm na ciągi znaków może być użyteczna w automatycznej analizie, takiej jak sprawdzenie, czy wygenerowany kod mógł się regresować.

Funkcja sprint jest funkcją wyższego rzędu, która jako pierwszy argument przyjmuje funkcję działającą na obiektach IO . Za kulisami tworzy IOBuffer w pamięci RAM, wywołuje daną funkcję i przenosi dane z bufora do obiektu String .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow