Julia Language
Smyczki
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
.