#ocaml
Вопрос:
Мой код выглядит следующим образом
let newObj (s) : someObj =
let myStr = ref s in
let myInt = ref 0 in {
someFun = (fun newS ->
match !myStr with
| newS -> true
| _ -> false
}
;;
Я протестировал этот код
let test = newObj "right";;
test.someFun "right";;
test.someFun "wrong";;
Оба вызова SomeFun возвращают значение true.
Я также пытался
if (!mystr = newS) then true else false
и это работает. Почему?
Комментарии:
1. Можете ли вы уточнить, в чем именно заключается ваша проблема
Ответ №1:
Значение идентификатора в шаблоне-это не то, что вы, кажется, думаете. Любой идентификатор, который появляется в шаблоне, является новым вхождением идентификатора, который будет привязан к любому сопоставленному значению. Итак, этот матч:
match !myStr with
| newS -> true
| _ -> false
всегда будет совпадать в первом случае. Он привязывает идентификатор newS
к значению !myStr
; однако это не имеет видимого эффекта, так как вы не используете newS
в связанном выражении.
Значение newS
в шаблоне не имеет ничего общего с каким-либо предыдущим появлением идентификатора newS
. Это новое использование идентификатора.
Вот почему это if
утверждение работает. Это относится к существующей привязке идентификатора (здесь нет никакого шаблона).
Как я уже отмечал, когда я ввожу приведенное выше выражение, компилятор предупреждает меня следующим образом:
Warning 11: this match case is unused.
Компилятор указывает, что вторая ветвь соответствия никогда не будет использоваться. Первая ветвь всегда совпадает.
Хорошо обращать внимание на подобные предупреждения.