2013-06-09 7 views
6

मैं इस संरचना में फ़ील्ड के प्रकार को कैसे लागू कर सकता हूं?मैं संरचना के क्षेत्र को किसी प्रकार के होने के लिए कैसे मजबूर करूं?

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

उदाहरण:

#lang racket 
(struct Car (model year)) 

मैं एक अनुबंध (पी लेकिन जब से मैं रैकेट के लिए नया हूँ, यह एक स्पष्ट रूप से काम नहीं करता है ...): का उपयोग कर की कोशिश की है यह succeds लेकिन यह नहीं करना चाहिए ...

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

दुःख की बात यह है कि यह कैसे किया जाना कहीं भी लिखा होना प्रतीत नहीं होता।

उत्तर

6

मुझे लगता है कि आप कम से कम एक है, और शायद निम्न दोनों कम पड़ रहा है:

  1. का उपयोग (provide (contract-out ....)) का मतलब अनुबंध केवल मॉड्यूल सीमा पर लागू होता है - केवल अन्य मॉड्यूल require इस के लिए एक। तो यदि आपका परीक्षण उदाहरण एक ही मॉड्यूल में था, तो अनुबंध लागू नहीं होगा। इसके बजाय आप define/contract का उपयोग उस अनुबंध पर लागू करने के लिए कर सकते हैं, दोनों मॉड्यूल में जहां यह परिभाषित किया गया है और बाहर provide है।

  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)) 

पी.एस. रैकेट में FWIW सामान्य शैली संरचना नाम को कैपिटल करने के लिए carCar नहीं है।


अद्यतन: बस अंतर अधिक स्पष्ट रूप से वर्णन करने के लिए:

#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 में ऑटोमोबाइल का आविष्कार किया गया था, तो 'वर्ष' के लिए आपका अनुबंध' (और/c पूर्णांक? (>/C 1768) हो सकता है) 'केवल' पूर्णांक 'के बजाय '। ;) –

+0

बहुत बहुत धन्यवाद, यह पूरी तरह से काम किया :) – TesX

संबंधित मुद्दे

 संबंधित मुद्दे