2013-06-09 2 views
6

この構造体のフィールドのタイプを強制するにはどうすればよいですか?構造体のフィールドに何らかの型を強制するにはどうしたらいいですか?

私は契約書を使用してみました(私はラケットに新たなんだから、これは明らかに...動作しません:P)
#lang racket 
(struct Car (model year)) 

(provide (contract-out 
     [Car (string? integer? . -> . Car?)])) 

:このsuccedsそれこれを成し遂げるためにどのよう

(define my-car (Car 2008 "A3"))

は悲しいことに、どこにも書かれていないようです...べきではありません。

答えて

6

私はあなたが少なくとも一つを打つ、そしておそらく両方の次のだと思う:

  1. (provide (contract-out ....))を使用すると、契約はモジュールの境界でのみ適用されることを意味 - のみrequireこのモジュールについて1。したがって、テストの例が同じモジュールにある場合、契約は適用されません。代わりに、define/contractを使用して、定義されているモジュールと、の場合は外部の両方で、商品自体に契約を適用することができます。

  2. フィールドごとに契約を指定するspecial form of contracts for structsがあります。上で試したことは、コンストラクタ関数のすぐ上の契約です。そのになりますが、代わりにstructの契約を使用することを検討してください。

    あなたが行うことができ、両方の組み合わせ

;; Define the contract on the struct itself. 
;; Contract is used even within this module. 
(provide car) 
(define-struct/contract car ([model string?] 
          [year integer?])) 

をあなたは、あなたが使用することになり、契約がのみモジュールの境界でを適用したいなかった場合:

;; Define the contract only as `provide`d. 
;; Contract is used only for code `require`-ing this module. 
(provide (contract-out (struct car ([model string?] 
            [year integer?])))) 
(struct car (model year)) 

P.S.ラケットのFWIWの一般的なスタイルはではなくで、carではなくCarです。


更新:ちょうどより明確に違いを説明する:

#lang racket 

(module mod racket 
    (provide car0) 
    (define-struct/contract car0 ([model string?] 
           [year integer?])) 

    (car0 "foo" "bar") ;; gives contract violation 
        ;; because contract on struct itself 

    (struct car1 (model year)) 
    (provide (contract-out (struct car1 ([model string?] 
             [year integer?])))) 

    (car1 "foo" "bar") ;; does NOT give contract violation 
        ;; because contract only on the `provide` 
) 

(require 'mod) 
(car0 "foo" "bar") ;; gives contract violation 
(car1 "foo" "bar") ;; gives contract violation 
+0

は、BTWの契約についてのクールなことは、彼らはC/C++意味で「種類」に限定されるものではないということです。たとえば、自動車が1769年に発明された場合、 'year'の契約は' 'integer? 'の代わりに' '(and/c integer?(>/c 1768))'になります。 ;) –

+0

ありがとう、それは完全に働いた:) – TesX

関連する問題