2015-05-06 5 views
5

Я не могу сделать эту работу. Я продолжаю ошибаться, говоря, что «len» не существует в типе «& [str]».Получение размера массива, переданного в качестве аргумента

fn testLength(arr: &[str]) { 
    if arr.len >= 10 { 
     // Do stuff 
    } 
} 

Я по-прежнему новичок в Rust, и я понимаю, что это указатель на необработанную строку где-то. Почему я не могу получить длину базовой строки во время выполнения? Такие вещи, как «длина струны в ржавчине» и «длина массива в ржавчине», не привели меня ни к чему.

ответ

12

Конечно, вы можете это сделать - это просто len не поле, это метод:

fn test_length(arr: &[String]){ 
    if arr.len() >= 10 { 
     // Do stuff 
    } 
} 

Если вы только начали изучать Rust, вы должны прочитать official book - вы также найдете, почему &[str] не имеет смысла (короче говоря, str - это нестандартный тип, и вы не можете создать его массив; вместо этого &str следует использовать для заимствованных строк и String для принадлежащих строк; скорее всего у вас есть Vec<String> где-нибудь, и вы можете легко получить &[String] из этого).

Я также хотел бы добавить, что неясно, хотите ли вы передать строку или массив строк в функцию. Если это строка, то вы должны написать

fn test_length(arr: &str) { 
    if arr.len() >= 10 { 
     // Do stuff 
    } 
} 

len() на строку, однако, возвращает длину в байтах, который может быть не то, что вам нужно (длина в байтах! = Длина в «символы» в целом, любое определение «характер», которое вы используете, потому что строки находятся в UTF-8 в Rust, а UTF-8 - кодирование с переменной шириной).

Обратите внимание, что я также изменил testLength на test_length, потому что snake_case является принятым соглашением для программ Rust.

+0

Так что я бы не использовал & [str] вообще? Что, если мне нужен массив заимствованных строк? Будет ли это [& str]? – Steve

+0

@Steve, yes, '& [& str]' - это фрагмент заимствованных строк (а не массивы - массивы имеют фиксированный размер и их типы выглядят как '[&str; 123]'). '& [str]' не является допустимым типом - 'T' в' & [T] 'должен быть размером (реализовать' Sized' trait), потому что срезы указывают на последовательность элементов, которые выложены в памяти равномерно. Это требует, чтобы каждый элемент имел определенный размер. 'str' не имеет определенного размера, поэтому он не реализует' Sized' и не может использоваться в массивах. Кроме того, также нет способа построить bare 'str'. –

+0

Благодарим за помощь! – Steve

Смежные вопросы