<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                19-魔法印(Sigils) ========== [正則表達式](#191-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F) <br/> [字符串、字符列表和單詞魔法印](#192-%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%AD%97%E7%AC%A6%E5%88%97%E8%A1%A8%E5%92%8C%E5%8D%95%E8%AF%8D%E9%AD%94%E6%B3%95%E5%8D%B0) <br/> [自定義魔法印](#193-%E8%87%AA%E5%AE%9A%E4%B9%89%E9%AD%94%E6%B3%95%E5%8D%B0) <br/> >看看標題,這個“魔法印”是什么奇葩翻譯?Sigil原意是“魔符,圖章,印記”,如古代西方魔幻傳說中的巫女、魔法師畫的封印或者召喚魔鬼的六芒星,中國道士畫的咒符,火影里面召喚守護獸的血印等。 在計算機編程領域,Sigil指的是在變量名稱上做的標記,用來標明它的作用域或者類型什么的。 例如某語言里面```$var```中的```$```就是這樣的東西,表示其為全局變量。 這么看,翻譯成“魔法印”還挺帶感呢。 我們已經學習了Elixir提供的字符串(雙引號包裹)和字符列表(單引號包裹)。 但是對于Elixir中所有的*文本描述型數據類型*來說,這些只是冰山一角。其它的,例如*原子*也是一種文本描述型數據類型。 Elixir的一個特點就是高可擴展性:開發者能夠為特定的領域來擴展語言。 計算機科學的領域已是如此廣闊。幾乎無法設計一門語言來涵蓋所有范圍。 我們的打算是,與其創造出一種萬能的語言,不如創造一種可擴展的語言,讓開發者可以根據所從事的領域來對語言進行擴展。 本章將講述“魔法印(sigils)”,它是Elixir提供的處理文本描述型數據的一種機制。 ## 19.1-正則表達式 魔法印以波浪號(~)起頭,后面跟著一個字母,然后是分隔符。 最常用的魔法印是~r,代表[正則表達式](https://en.wikipedia.org/wiki/Regular_Expressions): ```elixir # A regular expression that returns true if the text has foo or bar iex> regex = ~r/foo|bar/ ~r/foo|bar/ iex> "foo" =~ regex true iex> "bat" =~ regex false ``` Elixir提供了Perl兼容的正則表達式(regex),由[PCRE庫](http://www.pcre.org/)實現。 正則表達式支持修飾符(modifiers),例如```i```修飾符使該正則表達式無視大小寫: ```elixir iex> "HELLO" =~ ~r/hello/ false iex> "HELLO" =~ ~r/hello/i true ``` 閱讀[Regex模塊](http://elixir-lang.org/docs/stable/elixir/Regex.html)獲取關于其它修飾符的及其所支持的操作的更多信息。 目前為止,所有的例子都用了```/```界定正則表達式。事實上魔法印支持8種不同的分隔符: ```elixir ~r/hello/ ~r|hello| ~r"hello" ~r'hello' ~r(hello) ~r[hello] ~r{hello} ~r<hello> ``` 支持多種分隔符是因為在處理不同的魔法印的時候更加方便。 比如,使用括號作為正則表達式的分隔符會讓人困惑,分不清括號是正則模式的一部分還是別的什么。 但是,括號對某些魔法印來說就很方便。 ## 19.2-字符串、字符列表和單詞魔法印 除了正則表達式,Elixir還提供了三種魔法印。 ```~s``` 魔法印用來生成字符串,類似雙引號的作用: ```elixir iex> ~s(this is a string with "quotes") "this is a string with \"quotes\"" ``` 通過這個例子可以看出,如果文本中有雙引號,又不想逐個轉義,可以用這種魔法印來包裹字符串。 ```~c``` 魔法印用來生成字符列表: ```elixir iex> ~c(this is a string with "quotes") 'this is a string with "quotes"' ``` ```~w``` 魔法印用來生成單詞,以空格分隔開: ```elixir iex> ~w(foo bar bat) ["foo", "bar", "bat"] ``` ```~w``` 魔法印還接受```c```,```s```和```a```修飾符(分別代表字符列表,字符串和原子)來選擇結果的類型: ```elixir iex> ~w(foo bar bat)a [:foo, :bar, :bat] ``` 除了小寫的魔法印,Elixir還支持大寫的魔法印。如,```~s```和```~S```都返回字符串,前者會解釋轉義字符而后者不會: ```elixir iex> ~s(String with escape codes \x26 interpolation) "String with escape codes & interpolation" iex> ~S(String without escape codes and without #{interpolation}) "String without escape codes and without \#{interpolation}" ``` 字符串和字符列表支持以下轉義字符: - \" 表示一個雙引號 - \' 表示一個單引號 - \\\ 表示一個反斜杠 - \a 響鈴 - \b 退格 - \d 刪除 - \e 退出 - \f 換頁 - \n 新行 - \r 換行 - \s 空格 - \t 水平制表符 - \v 垂直制表符 - \DDD, \DD, \D 八進制數字(如\377) - \xDD 十六進制數字(如\x13) - \x{D...} 多個十六進制字符的十六進制數(如\x{abc13} 魔法印還支持多行文本(heredocs),使用的是三個雙引號或單引號: ```elixir iex> ~s""" ...> this is ...> a heredoc string ...> """ ``` 最常見的有多行文本的魔法印就是寫注釋文檔了。 例如,如果你要在注釋里寫一些轉義字符,這有可能會報錯。 ```elixir @doc """ Converts double-quotes to single-quotes. ## Examples iex> convert("\\\"foo\\\"") "'foo'" """ def convert(...) ``` 使用```~S```,我們就可以避免問題: ```elixir @doc ~S""" Converts double-quotes to single-quotes. ## Examples iex> convert("\"foo\"") "'foo'" """ def convert(...) ``` ### 19.3-自定義魔法印 本章開頭提到過,魔法印是可擴展的。事實上,魔法印```~r/foo/i```等于是用兩個參數調用了函數```sigil_r```: ```elixir iex> sigil_r(<<"foo">>, 'i') ~r"foo"i ``` 就是說,我們可以通過該函數閱讀魔法印```~r```的文檔: ```elixir iex> h sigil_r ... ``` 我們也可以通過實現相應的函數來提供我們自己的魔法印。例如,我們來實現一個```~i(N)```魔法印,返回整數: ```elixir iex> defmodule MySigils do ...> def sigil_i(string, []), do: String.to_integer(string) ...> end iex> import MySigils iex> ~i("13") 13 ``` 魔法印通過宏,可以用來做一些發生在*編譯時*的工作。例如,正則表達式在編譯時會被編譯,而在執行的時候就不必再被編譯了。 如果你對此主題感興趣,可以多閱讀關于宏的資料,并且閱讀Kernel模塊中那些魔法印的實現。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看