2010-09-15 39 views
14

我有如下記載:如何鍵入提示數組?

(defrecord Signal [samples ^double sample-rate ^double scaling-factor]) 

如何指定samples是一個雙陣列?

我使用Clojure的1.2.0

編輯:

@dreish我碰到下面的輸出,當我打電話(show Signal)從levand後的變化:

[35] <init> (Object,double,double) 
[36] <init> (Object,double,double,Object,Object) 
[37] __extmap : Object 
[38] __meta : Object 
[39] sample_rate : double 
[40] samples : Object 
[41] scaling_factor : double 

我知道,提示非原始類型僅用於避免反射。從目前的非原始類型的類型暗示將不會被用於約束的字段類型,也不是構造ARG,但將用於優化類方法及其使用http://clojure.org/datatypes

謝謝大家!

回答

18

像這樣:

(defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor]) 

豐富希基加入此而回:

添加特殊類型的提示爲基本數組 - #^整數,#^花車,#^多頭,#^雙打

請參閱http://clojure.org/news瞭解它是如何工作的。

我沒有一個Clojure環境與我來看看這是否仍然是最好的方式來做到這一點。我假設#^語法是1.2

編輯所有Clojure中的其他類型的提示一起更新^:它另一篇博客:http://asymmetrical-view.com/2009/07/02/clojure-primitive-arrays.html

5

我同意levand對使用哪種類型的提示答案,但您可能想要檢查defrecord是否實際使用這些類型提示。在我的安裝(也是1.2.0)上,它沒有。

user=> (defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor]) 
user.Signal 
user=> (use '[clojure.contrib.repl-utils :only [show]])  
nil 
user=> (show Signal) 
=== public final user.Signal === 

[stuff deleted] 

[38] <init> (Object,Object,Object) 
[39] __extmap : Object 
[40] __meta : Object 
[41] sample_rate : Object 
[42] samples : Object 
[43] scaling_factor : Object 

[more stuff deleted] 

正如你可以看到,構造函數的參數(38)和成員變量(41-43)仍然只是Object秒。 (數組是引用反正,但一旦該功能被實現,將是不錯的一天能夠到拆箱數字存儲記錄。)

4

要闡述什麼dreish寫道:

因爲它是目前實施( 1.2)中,類型提示不會在API中顯示(實例變量,構造函數/方法簽名),而是用於消除詞法範圍內的反射調用。例如:

 
user=> (set! *warn-on-reflection* true) 
true 
user=> (defprotocol P (foo [p])) 
P 
user=> (defrecord R [n] P (foo [_] (.intValue n))) 
Reflection warning, NO_SOURCE_PATH:4 - reference to field intValue can't be resolved. 
user.R 
user=> (defrecord R [^Number n] P (foo [_] (.intValue n))) 
user.R 

剩下的就是原始號碼的拳擊,但雙陣列是,一個對象,所以不用擔心有問題。這就是說,我相信在主分支(1.3)中有一些增強功能,這樣實例變量等可以作爲基於類型提示的基本類型發出。