为什么Option <string> .as_ref()不能解释为Option&lt;&amp; str&gt;?

时间:2017-05-24 16:13:31

标签: string rust optional

我希望这两个代码示例都有相同的结果:

<uc1:TestCustControl SkinID="GridViewNew" Runat="server" HeaderStyle-Wrap="false" PageSize="50" GridLines="None" CellPadding="4" width="100%"  CssClass="GridViewStyle" >
    <HeaderStyle CssClass="GridViewHeaderStyle" />
    <RowStyle CssClass="GridViewRowStyle" />
    <AlternatingRowStyle CssClass="GridViewAlternatingRowStyle"/>
    <SelectedRowStyle CssClass="GridViewSelectedRowStyle" />
    <PagerStyle CssClass="GridViewPagerStyle" />
    <FooterStyle CssClass="GridViewFooterStyle" />
</uc1:TestCustControl>

<asp:GridView SkinID="GridViewNew" Runat="server" HeaderStyle-Wrap="false" PageSize="20" GridLines="None" CellPadding="4" width="100%" CssClass="GridViewStyle" >
    <HeaderStyle CssClass="GridViewHeaderStyle" />
    <RowStyle CssClass="GridViewRowStyle" />
    <AlternatingRowStyle CssClass="GridViewAlternatingRowStyle"/>
    <SelectedRowStyle CssClass="GridViewSelectedRowStyle" />
    <PagerStyle CssClass="GridViewPagerStyle" />
    <FooterStyle CssClass="GridViewFooterStyle" />
</asp:GridView>
let maybe_string = Some(String::from("foo"));
let string = if let Some(ref value) = maybe_string { value } else { "none" };

第二个样本给我一个错误:

let maybe_string = Some(String::from("foo"));
let string = maybe_string.as_ref().unwrap_or("none");

1 个答案:

答案 0 :(得分:4)

因为这是Option::as_ref的定义方式:

impl<T> Option<T> {
    fn as_ref(&self) -> Option<&T>
}

由于您有Option<String>,因此结果类型必须Option<&String>

相反,您可以添加String::as_str

maybe_string.as_ref().map(String::as_str).unwrap_or("none");

或更短的:

maybe_string.as_ref().map_or("none", String::as_str);

最后,您还可以使用Option::deref

另见: