我刚刚开始通过exercism.io了解合同,所以我签了一份合同:
[step1 (-> (and/c number?
less-than-one-hundred?)
string?)]
我认为我的意思是该函数将采用小于一百的数字(该函数定义为:
(define (less-than-one-hundred? n)
(< n 100))
但是当我这样调用函数时:
(step1 100)
没有违反合同的情况。我在做什么错了?
答案 0 :(得分:2)
仅在模块边界上执行合同。
这意味着,如果您的表达式polyfills.bundle.js
与合同约定在同一个模块中,则不会检查输入。
但是,如果您导出带有合同的(step1 100)
,然后在另一个模块中导入step1
并对其进行调用,则会检查该合同。
答案 1 :(得分:2)
这是Soegaard的回答说的一个具体例子:
def-step1.rkt
this.setState({
campus: e.target.value.map(school => school.value)
});
use-step1.rkt
#lang racket
(provide (contract-out
[step1 (-> (and/c number?
less-than-one-hundred?)
string?)]))
(define (less-than-one-hundred? n)
(< n 100))
(define (step1 x) "")
这会产生您所期望的违反合同的行为,特别是,它责怪{em> #lang racket
(require "def-step1.rkt")
(step1 100)
,而不是use-step1.rkt
所来自的合同的“合同方”:< / p>
def-step1.rkt