日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

JS語法也可以有C#的switch表達(dá)式

瀏覽:52日期:2022-06-09 15:19:28
目錄
  • 正文
  • 新的約束
  • when 函數(shù)寫法
  • 分算等級”測試
    • 測試問題
    • 升級成 TypeScript

正文

于 C/Java 語系的語言,都有 switch 語法。switch 語法用于多分支是一個標(biāo)準(zhǔn)的用法,但這個分支語法的各分支之間存在穿透性,所以需要 break 來切斷邏輯,這也成為 switch 語法中最重要的一個替在缺陷來源。此外,由于 switch 語句中各 case 的代碼是在同一個作用域中,也會對代碼造成一些不便。

C# 8.0 引入了 switch 表達(dá)式。C# 的 switch 表達(dá)式有著非常豐富的語法元素,可以和模式匹配和解構(gòu)等語法元素協(xié)同工作 —— 這些都不在這里細(xì)說,但是對傳統(tǒng)的 switch 語句 進(jìn)行了一些改進(jìn):

  • 通過箭頭 (=>) 標(biāo)記處理了 case 和語句之間的一對一關(guān)系,不需要 break,不再穿透;
  • 作為表達(dá)式,可以而且必須返回值;

新的約束

  • switch 表達(dá)式一定要詳盡(邏輯一定會走進(jìn)某一個 case,可以通過棄元模式兜底),否則可能會在運(yùn)行時引發(fā)異常。

在 C# 8.0 發(fā)布的同年,Java 12 也發(fā)布并引入了 switch 表達(dá)式預(yù)覽。Java 的 switch 表達(dá)式實(shí)現(xiàn)比較簡單,就是 switch 語句到 switch 表達(dá)式的直接轉(zhuǎn)換,僅支持等值匹配。直到 2023 年 3 月 Java 20 發(fā)布,switch 表達(dá)式才開始支持模式匹配。相比之下,Kotlin 的 when 表達(dá)式走在了前面。

在這個問題上 JavaScript 似乎走在了后面,不過在語言提供 switch 表達(dá)式之前,我們可以嘗試自己造個輪子。

思路當(dāng)然是參考策略模式。假設(shè)有一個列表,這個列表里的每個元素都包含了兩個因素:第一個用于判斷是否命中,第二個是個函數(shù),得到一個計(jì)算結(jié)果。然后寫一個循環(huán)遍歷列表的每個元素,一旦某個元素命中,就執(zhí)行元素?cái)y帶的函數(shù)獲得結(jié)果,中斷循環(huán),返回結(jié)果。如果列表的最后一個元素必定命中,那么這個列表就是“詳盡”的。

when 函數(shù)寫法

那么這個 when 函數(shù)可能會這樣寫(switch 是關(guān)鍵字,所以使用 when 來作為函數(shù)名):

// JS
function when(value, ...cases) {
    for (const { is, run } of cases) {
if (is(value)) {
    return run(value);
}
    }
    throw new Error("非詳盡");
}

這里我們假設(shè)每個情況 (case) 都含有 is 方法用于判斷是否命中,用 run 方法保存命中后需要執(zhí)行的操作。

分算等級”測試

相應(yīng)地,我們可以經(jīng)典的“拿分算等級”來進(jìn)行測試:

// JS
function calcGrade(score) {
    return when(
score,
{ is: v => v >= 0 && v < 80, run: v => `不合格 (${v})` },
{ is: v => v >= 80 && v < 100, run: v => `合格 (${v})` },
{ is: v => v == 100, run: v => `滿分 (${v})` },
{ is: _ => true, run: v => `無效 (${v})` },
    );
}
for (let i = 0; i < 50; i++) {
    const v = 70 + ~~(Math.random() * 35);
    console.log(calcGrade(v));
}

在 calcGrade 實(shí)現(xiàn)中 when 的 case 列表最后一項(xiàng)采用了“永真”斷言,所以走到這一項(xiàng)的時候一定會命中,從邏輯上來永遠(yuǎn)不會觸發(fā) Error。如果是非“詳盡”的情況列表,就有可能觸發(fā) Error。

測試問題

不過現(xiàn)在從測試代碼中就發(fā)現(xiàn)了兩個問題:

  • is 斷言是采用函數(shù)的形式,不能簡單地直接按值匹配;
  • 從調(diào)用形式上來說,score 和后面的 case 元素是同級的,形式上區(qū)分不明顯;
  • 每次都要寫 is 和 run,條件多了寫起來也煩。

繼續(xù)改進(jìn) ——

// JS
function when(value) {
    // when 的參數(shù)先給 switch 的值
    // 返回一個函數(shù)來處理分支匹配 ②
    return function (...cases) {
for (const [is, run] of cases) {
// ^^^^^^^^^ 從對象改為元組(數(shù)組)③
    if (value === is || (typeof is == "function" && is(value))) {
//    ^^^^^^ 精確判斷 ①
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 斷言函數(shù)判斷
return  run(value);
//    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 可指定行為(函數(shù))
    }
}
throw new Error("非詳盡");
    };
}
function calcGrade(score) {
    return when(score)(
// ^^^^^^^^^^^ 這里返回的是匹配處理的函數(shù)
[v => v >= 0 && v < 80, v => `不合格 (${v})`],
[v => v >= 80 && v < 100, v => `合格 (${v})`],
[100, () => "滿分 (100)"],
//       ^^^ 可以指定匹配的值
//    ^^ 計(jì)算不需要參數(shù),可以不聲明
[_ => true, v => `無效 (${v})`],
//       ^^^^^^^^^ 兜底的永真斷言
    );
}

為什么兜底斷言必須使用一個函數(shù)呢?因?yàn)?nbsp;true 值也有可能是對應(yīng)一種預(yù)想的分支情況。由于這個 when 是通過語義來實(shí)現(xiàn)而不是通過語法來實(shí)現(xiàn)的,所以這里沒辦法定義一個安全的兜底斷言語法,只有用斷言函數(shù)會相對安全。

升級成 TypeScript

至此為止我們已經(jīng)基本實(shí)現(xiàn)了 switch 表達(dá)式 (when),把它升級成 TypeScript

// TypeScript
type CaseCondition<T> = T extends Function ? never : ((t: T) => boolean) | T
type Case<T, R> = [CaseCondition<T>, (t: T) => R];
function when<T>(value: T): <R>(...cases: Case<T, R>[]) => R {
    return function<R>(...cases: Case<T, R>[]): R {
for (const [is, run] of cases) {
    if (value === is || (typeof is == "function" && is(value))) {
return run(value);
    }
}
throw new Error("非詳盡");
    };
}
function calcGrade(score: number) {
    return when(score)(
[v => v >= 0 && v < 80, v => `不合格 (${v})`],
[v => v >= 80 && v < 100, v => `合格 (${v})`],
[100, () => "滿分 (100)"],
[_ => true, v => `無效 (${v})`],
    );
}

這段代碼當(dāng)然可以直接用,但是如果使用 npm 可能會更方便一點(diǎn):

npm install @jamesfancy/when
// TypeScript
import { when } from "@jamesfancy/when";
function calcGrade(score: number) {
    return when(score)(
[v => v >= 0 && v < 80, v => `不合格 (${v})`],
[v => v >= 80 && v < 100, v => `合格 (${v})`],
[100, () => "滿分 (100)"],
[_ => true, v => `無效 (${v})`],
    );
}

以上就是JS語法也可以有C# 的switch表達(dá)式的詳細(xì)內(nèi)容,更多關(guān)于JS語法C# switch表達(dá)式的資料請關(guān)注其它相關(guān)文章!

標(biāo)簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费一级欧美片在线观看网站| 日韩欧美一区二区三区免费看| 久久影视三级福利片| 视频在线在亚洲| 少妇精品导航| 日韩理论视频| 中文字幕在线视频网站| 福利精品在线| caoporn视频在线| 精品国产亚洲一区二区三区在线 | 日韩av不卡在线观看| 亚洲毛片网站| 日韩精品欧美大片| 日韩三级精品| 日韩精品一区二区三区av | 欧美一区成人| 日韩成人午夜精品| 欧美亚洲三级| 欧美激情五月| 精品久久久亚洲| 精品久久精品| 亚洲精品88| 深夜福利视频一区二区| 在线一区视频观看| 午夜久久一区| 亚洲开心激情| 国产欧美日韩| 久久久久久夜| 国产一区亚洲| 亚洲精品看片| 国产欧美啪啪| 日韩av自拍| 久久精品影视| 亚洲一区黄色| 欧美午夜三级| 亚洲黄色网址| 亚洲国产成人精品女人| 中文亚洲欧美| 国产欧美日韩一区二区三区四区| 久久久久亚洲精品中文字幕| 国产精品毛片一区二区在线看| 欧美日韩水蜜桃| 亚洲欧美日韩在线观看a三区 | 999国产精品| 手机精品视频在线观看| 欧美亚洲福利| 免费观看亚洲| 久热综合在线亚洲精品| 91亚洲精品视频在线观看| 麻豆成人在线观看| zzzwww在线看片免费| 狠狠色狠狠色综合日日tαg| 日韩激情视频网站| 精品视频久久| 欧美日韩国产综合网| 日本午夜精品久久久久| 91亚洲国产| 手机精品视频在线观看| 国产精品夜夜夜| 99久久夜色精品国产亚洲1000部| 一区二区三区午夜视频| 国产精品对白久久久久粗| 免费一二一二在线视频| 免费不卡在线视频| 久久三级毛片| 最新日韩欧美| 久久国内精品视频| 99久久99久久精品国产片果冰 | 久久a爱视频| 午夜av一区| 久久国内精品| 99re国产精品| 国产一区二区三区四区五区传媒| 99在线|亚洲一区二区| 久久精品国产久精国产爱| 国产精品日韩| 福利一区二区三区视频在线观看| 在线日韩电影| 国产高清日韩| 日韩天堂av| 精品三级av| 亚洲免费成人av在线| 精品欧美一区二区三区在线观看| 亚洲不卡视频| 久久精品亚洲人成影院| 国产日韩欧美三级| 久久av一区| av资源亚洲| 国产极品嫩模在线观看91精品| 另类国产ts人妖高潮视频| 日韩精品不卡一区二区| 青青草视频一区| 亚洲男女av一区二区| 国产精品成久久久久| 欧美日韩一区自拍| 视频一区欧美精品| 欧美日韩水蜜桃| 国产91在线精品| 国产精品嫩模av在线| 免费视频一区二区| 欧美精品一区二区三区精品| 国产一区日韩| 欧美精品97| 欧美亚洲自偷自偷| 亚洲美女91| 久久亚洲国产精品一区二区| 欧美日韩在线播放视频| 精品一区二区三区中文字幕视频| 中文字幕日韩高清在线| 波多野结衣一区| 日韩久久视频| 精品视频99| 麻豆精品久久久| 日韩1区2区日韩1区2区| 在线精品一区| 在线综合视频| 日韩视频二区| 午夜欧美在线| 午夜久久tv| 激情五月综合网| 欧美 日韩 国产精品免费观看| 97精品国产| 国产精品久久久久蜜臀| 国产美女久久| 国产精品sm| 国产精品xxx在线观看| 欧美日韩一区自拍| 欧美日韩1区| 国产精品尤物| 国产精品国码视频| 久久gogo国模啪啪裸体| 国产精品第一| 麻豆国产精品视频| 久草精品视频| 国产精品成久久久久| 国产91在线播放精品| 国产精品99一区二区三| 中文字幕在线看片| www.51av欧美视频| 成人免费电影网址| 久久久久久久久久久9不雅视频| 日韩国产一区二区| 日韩一区二区三区在线免费观看| 日韩电影在线视频| 波多视频一区| 欧美日韩一二三四| 午夜久久黄色| 日韩在线a电影| 亚洲精品免费观看| 日韩欧美中文字幕一区二区三区| 婷婷精品久久久久久久久久不卡| 涩涩涩久久久成人精品| 欧美亚洲三区| 国产欧美日韩精品一区二区三区| 国产精品久久久久久久久久齐齐 | 日韩a一区二区| 日韩精品欧美激情一区二区| 免费精品国产| 丝袜诱惑制服诱惑色一区在线观看| 日韩专区在线视频| 欧美三级第一页| 首页国产精品| 欧美日韩国产高清| 日韩精品五月天| 精品久久在线| 日韩国产欧美| 亚洲一区免费| 久久激情av| 亚洲播播91| 久久国产成人| 欧美国产亚洲精品| 亚洲www啪成人一区二区| 欧美在线综合| 麻豆一区二区99久久久久| 日本欧美不卡| 亚洲狼人精品一区二区三区| 国产伦乱精品| 韩国精品主播一区二区在线观看 | 日本免费一区二区三区四区| 亚洲天堂黄色| 欧美日韩 国产精品| 狠狠躁少妇一区二区三区| 亚洲欧美伊人| 欧美日本不卡高清| 免费污视频在线一区| 麻豆久久精品| 久久精品人人| 免费看的黄色欧美网站| 国产精品久久久久久久免费软件| 久久久精品网| 日本在线成人| 麻豆精品蜜桃视频网站| 黄色av日韩| 色综合五月天| 亚洲毛片网站| av一区在线| 欧美日韩国产一区二区在线观看| 精品三级久久| 青草国产精品久久久久久| 成人看片网站|