将unwrap_or与泛型类型一起使用

时间:2017-04-29 19:16:30

标签: rust

这就是我所拥有的:

use activation::Activation;
use activation::Sigmoid;

pub struct MainStruct<T> {
    activation: T
}

impl<T: Activation> MainStruct<T> {
    pub fn new(activation: Option<T>) -> MainStruct<T>
        where T: Activation
    {
        // default
        let activation_fn = activation.unwrap_or(Sigmoid {});

        MainStruct {
            activation: activation_fn,
        }
    }
}

activation::Activation是特征,Sigmoid实现Activation特征。我尝试做的是接受此特性作为输入,并且能够在None时分配默认值,但我收到此错误:

expected type parameter, found struct `activation::Sigmoid`

不确定是什么问题或者我需要以某种方式告诉编译器Sigmoid实现类型T(这是我们的特征)?

1 个答案:

答案 0 :(得分:3)

当你有一个类型参数时,调用者决定它是什么类型。但是,当TSigmoid时,您会尝试强制activationNone。然而,来电者可以使用MainStruct::new来呼叫None::<Widgetoid>,并且签名称它应该返回MainStruct<Widgetoid>。实际上,None不仅仅是一个常数,而是一个无穷大的常数,每个T一个。

不是在这里使用Option,而是应该有两个不同的构造函数:一个直接接受Activation的通用构造函数(不再是Option),默认的构造函数不需要// Generic impl, generic constructor impl<T: Activation> MainStruct<T> { pub fn new(activation: T) -> MainStruct<T> where T: Activation { MainStruct { activation: activation, } } } // Specific impl, specific constructor impl MainStruct<Sigmoid> { pub fn default() -> MainStruct<Sigmoid> { Self::new(Sigmoid {}) // delegate to generic constructor } } 参数。

default

您可能希望实现Default特征,而不是使MainStruct::default()成为固有的静态方法。 (Default is in the prelude,因此您无需导入即可拨打impl Default for MainStruct<Sigmoid> { fn default() -> MainStruct<Sigmoid> { Self::new(Sigmoid {}) } } 。)

<?php

function conn(){
    $user = 'root';
    $pass = '';
    $db = 'proj';
    $connection = mysqli_connect( "localhost", $user,$pass,$db);
    if($connection){}
    else{ die("Connection failed. Reason: ".mysqli_connect_error());}
    return $connection;
}
function getRoom($dt){
    $connection = conn();
    $sql = "SELECT * FROM reservation WHERE Check_out = $dt";
    $result = $connection->query($sql);
    $row = mysqli_fetch_assoc($result);
    $rn = $row['Room_Num'];
    return $rn;
}
$date = '2017-03-25';

echo getRoom($date);