2016-07-25 4 views
2

Я новичок в Elixir и пытаюсь получить случайную букву от функции.Случайные буквы возвращают пустой

Я пытаюсь определить функцию, возвращающую случайную букву между a и z.

По какой-то причине это иногда возвращает пустой символ. Почему?

defp random_letter do 
    "abcdefghijklmnopqrstuvwxyz" 
    |> String.split("") 
    |> Enum.random 
end 

def process do 
    Enum.each(1..12, fn(number) -> 
    IO.puts random_letter 
    end) 
end 

Выходные:

g 
m 
s 
v 
r 
o 
m 

x 
e 
j 
w 
+2

Как вы новичок, вот совет: Было бы _lot_ более эффективным, чтобы сделать это, чтобы получить случайную букву в нижнем регистре в виде строки: '<< ? a - 1 +: random.uniform (26) >> '. – Dogbert

ответ

2
String.split("abcdefghijklmnopqrstuvwxyz", "") 

возвращает

["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ""] 

Посмотрите на последний элемент в списке и вы получите ваш ответ :)

Чтобы избежать этого, вы можете использовать опцию trim, например, thi s:

String.split("abcdefghijklmnopqrstuvwxyz", "", trim: true) 
+0

Спасибо! Trim - это не поведение по умолчанию, это странно. – user1184756

0

Если вы хотите разделить строку, вот две альтернативы. Второй используется, когда вы используете строки Unicode.

iex(1)> String.codepoints("abcdefghijklmnopqrstuvwxyz") 
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", 
"q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 

iex(2)> String.graphemes("abcdefghijklmnopqrstuvwxyz") 
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", 
"q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 

Или вы можете использовать

iex(1)> <<Enum.random(?a..?z)>> 
"m" 
Смежные вопросы