再也看不到 undefined is not a function 或是 cannot access foo of undefined
但是 這些值其實依舊存在但是在 Reason 可以安全的存在
因為是通過 Option 來表示值是否存在
1
type option('a) = None | Some('a);
這代表這個值得類型是 None (無) 或是實際值包含在 Some 中
範例
1 2 3 4 5 6 7
let personHasCar = false;
if(personHasCar) { Some(5); } else { None; }
如果要表示一個數可能會是 None
但是可以利用另一種寫法
1 2 3 4 5 6 7 8
let licenseNumber = Some(5);
switch (licenseNumber) { | None => print_endline("The person doesn't have a car") | Some(number) => print_endline("The person's license number is " ++ string_of_int(number)) };
type testTuple = (int, int, int); let test: testTuple = (1, 2, 3);
let (_, second, _) = test;
Js.log(second);/* 2 */
/* Js.log(fst(test)); get compiler Error */ type test2Tuple = (int, int);
盡量在 區域性 使用 Tuple,若是有經常傳遞的需求則可以考慮使用 record
而且 Tuple + Switch 是十分強大的應用,可以解決 category bug
因為 Reason 會強迫你列出 2*2=4的所有可能情況而不用使用 ifelse 來做處理
1 2 3 4 5 6
switch (isWindowOpen, isDoorOpen) { | (true, true) => "window and door are open!" | (true, false) => "just window open" | (false, true) => "just door open" | (false, false) => "window and door are not open" }
但是總會有些時候必須要修改某個 Tuple 中的一個值
對 Reason 來說這就是一個新的 Tuple 範例如下:
1 2 3
let tuple1 = (1, 2); let tuple2 = (fst(tuple1), 4); Js.log(tuple2);
List
特性
包含的參數需要同型態
不可變的(immutable)
在陣列前面 shift 元素會效率很好
1 2
let myList: list(int) = [1, 2, 3]; let anotherList = [0, ...myList];
{ "name":"hello-world", "version":"0.1.0", "sources":{ "dir":"src", "subdirs":true }, "package-specs":{ "module":"commonjs", "in-source":true }, "suffix":".bs.js", "bs-dependencies":[ // add your dependencies here. You'd usually install them normally through `npm install my-dependency`. If my-dependency has a bsconfig.json too, then everything will work seamlessly. ], "warnings":{ "error":"+101" }, "namespace":true, "refmt":3 }
adopters 設定是 public, public 有 getter method 回傳一個值 但是因為在這個範例 adopters 是一個陣列,所以等等會寫一個 function 回傳整個陣列
First Function: Adopting a pet
1 2 3 4 5 6 7 8 9 10 11 12 13
pragma solidity ^0.5.0;
contract Adoption { address[16] public adopters; // Adopting a pet function adopt(uint petId) public returns (uint) { require(petId >= 0 && petId <= 15);