Как создать вектор объектов-признаков из векторов объектов, реализующих черту? [Дубликат]

Этот запрос должен работать:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Проблема заключается в одинарных кавычках, поэтому ваш запрос завершается с ошибкой и возвращает FALSE, и цикл WHILE не может выполняться. Использование% позволяет сопоставлять любые результаты, содержащие вашу строку (например, SomeText- $ username-SomeText).

Это просто ответ на ваш вопрос, вы должны реализовать материал, упомянутый в других сообщениях: обработка ошибок , используйте escape-строки (пользователи могут вводить что-либо в поле, и вы ДОЛЖНЫ убедиться, что это не произвольный код), используйте PDO вместо mysql_connect, который теперь лишен.

38
задан Wojtek Erbetowski 26 October 2015 в 10:55
поделиться

2 ответа

Vec<Animal> не является законным, но компилятор не может вам сказать, потому что несоответствие типа каким-то образом скрывает его. Если мы удалим вызовы на push, компилятор даст нам следующую ошибку:

<anon>:22:9: 22:40 error: instantiating a type parameter with an incompatible type `Animal`, which does not fulfill `Sized` [E0144]
<anon>:22     let mut v: Vec<Animal> = Vec::new();
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Причина, по которой это не является законным, заключается в том, что Vec<T> хранит много T объектов последовательно в памяти. Тем не менее, Animal является признаком, а черты не имеют размера (а Cat и Dog не имеют одинакового размера).

Чтобы решить эту проблему, нам нужно сохранить то, что имеет размер в Vec. Наиболее простым решением является обертывание значений в Box, то есть Vec<Box<Animal>>. Box<T> имеет фиксированный размер («указатель жира», если T - это признак, простой указатель в противном случае).

Вот работа main:

fn main () {
    let dog: Dog = Dog;
    let cat: Cat = Cat;
    let mut v: Vec<Box<Animal>> = Vec::new();
    v.push(Box::new(cat));
    v.push(Box::new(dog));
    for animal in v.iter() {
        println!("{}", animal.make_sound());
    }
}
53
ответ дан Lukas Kalbertodt 25 August 2018 в 06:15
поделиться

Вы можете использовать объект ссылочного объекта &Animal для заимствования элементов и сохранения этих объектов-признаков в Vec. Затем вы можете перечислить его и использовать интерфейс признака.

Изменение общего типа Vec путем добавления & перед признаком будет работать:

fn main() {
    let dog: Dog = Dog;
    let cat: Cat = Cat;
    let mut v: Vec<&Animal> = Vec::new();
    //             ~~~~~~~
    v.push(&dog);
    v.push(&cat);
    for animal in v.iter() {
        println!("{}", animal.make_sound());
    }
    // Ownership is still bound to the original variable.
    println!("{}", cat.make_sound());
}

Это здорово, если вы можете захотеть, чтобы исходная переменная сохраняла право собственности и повторно использовала ее позже.

Имейте ввиду, что вы не можете передать права собственности на dog или cat, потому что Vec заимствовал эти конкретные экземпляры в той же области.

Знакомство с новой областью может помочь справиться с этой конкретной ситуацией:

fn main() {
    let dog: Dog = Dog;
    let cat: Cat = Cat;
    {
        let mut v: Vec<&Animal> = Vec::new();
        v.push(&dog);
        v.push(&cat);
        for animal in v.iter() {
            println!("{}", animal.make_sound());
        }
    }
    let pete_dog: Dog = dog;
    println!("{}", pete_dog.make_sound());
}
8
ответ дан Shepmaster 25 August 2018 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: