2016-08-18 58 views
0

我正在研究一個庫,它將提供軸對齊邊界框(AABB)操作的特徵。這種特點就是聲明如下:如何爲通用數值類型創建特定值?

trait Aabb { 
    type Precision : Zero + One + Num + PartialOrd + Copy; 
    // [...] 
} 

我不在乎用戶選擇什麼樣的精度,只要這些限制得到尊重(但我真的不希望被選爲整數類型)。

我無法使用文字。有些操作需要恆定的值,作爲一個例子:

let extension = 0.1; 
aabb.extend(extension); 

這不起作用,因爲Aabb::extend預計Aabb::Precision而不是浮動。我的解決辦法是這樣的:

let mut ten = Aabb::Precision::zero(); 
for _ in 0..10 { 
    ten = ten + Aabb::Precision::one(); 
} 

aabb_extension = Aabb::Precision::one()/ten; 

這工作,但我需要每一個我需要一個具體的數字時訴諸這一點,它是越來越繁瑣。這真的是唯一的方法嗎?

+0

您可以要求'Precision'實現'從'。 – starblue

+0

@starblue我也試過,但f32沒有實現從這就是我期望使用最多的類型 –

+0

那麼,你可以使用'From '呢? – starblue

回答

1

我需要訴諸這一點,每次我需要一個特定的號碼,它變得越來越繁瑣。這真的是唯一的方法嗎?

基本上,是的。除非你能回答「你如何支持將字面值0轉換爲MyCustomTypeThatImplementsTheTrait」的問題。

你不能擁有它 - 你不能要求某些東西是通用的,然後使用具體的文字。

您可以有不同的解決方法。例如,提供諸如「零」和「一個」等基本值,或者具有「將特定類型轉換爲自己」的方法。

你也可以重新評估你正在嘗試做什麼;也許你正在考慮的水平太低了。實際上,「擴展0.1」代表0到1之間浮點值的類型是什麼意思?

也許最好是有一個expand_by_percentage方法,或者其他在域中有意義的方法。


參見:

+0

我擴展了任意值,因爲算法需要AABB和最小尺寸,如果您使用類似'0.0001'的東西來表示儀表,則「0.1」只是很糟糕。但是,那麼你會遇到更多的問題,而不是一個未經優化的樹。無論如何,謝謝你的回答,我會堅持手動構建值。 –

+0

@LukeB。如果您允許泛型類型被傳遞,那麼您無法對類型如何實現該特徵做一個全面的聲明,或者哪種類型的值將被該類型優化。 – Shepmaster

+0

你能舉一個可能出錯的例子嗎?如果你沒有正確地實現這個特性,它不會起作用,但是我不能真正捍衛我的代碼,反對那個嗎? –

1

在這種情況下,我建議您創建自己的特徵並提供方法的默認實現。

例如,我會天真地想象:

trait ApproximateValue: Zero + One { 
    fn approximate(val: f64) -> ApproximateValue { 
     // some algorithm to create "val" from Zero and One 
    } 
} 

然後,你Precision相關的類型將有束縛的ApproximateValue,你將只需要調用Precision::approximate(0.1)

+0

我無法編譯它,它在'approximate'的返回值中表示'丟失關聯類型'輸出'值',將其更改爲'Approximate近似值<輸出=近似值>>'僅向前推送錯誤。 –

+0

@LukeB .:在我提出的代碼中,沒有'Output'和'Approximate'沒有關聯類型...所以我需要看你的代碼來理解發生了什麼事情(你可以使用Rust的嬰兒圍欄例如,或者主旨)。 –

+0

我剛剛複製並粘貼你的代碼(並添加了一個'未實現!()'調用)。我試着把你的代碼粘貼到操場中,但不能在那裏編譯它,儘管錯誤是不同的'特性'近似值'不能被製作成對象' –

相關問題