iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
Modern Web

速成 Phoenix, 2022年最受喜愛框架系列 第 4

{04, Elixir, "模組與方法"}

  • 分享至 

  • xImage
  •  

全部都是方法

Elixir 是一個比較寬鬆的 Functional(函式) 語言,
他有 Functional 語言的好處,沒有物件、沒有類別,只有方法。也沒有嚴謹的 Functional 語言那樣限制東限制西,
我都這樣介紹,簡單粗暴好學好延伸。

不知道為什麼我對 function 翻譯成函式覺得渾身不對勁,雖然翻成方法可能有點不對,但看起來比較簡單,這系列就都用 "方法" 來稱 function

因為全部都是方法,簡單寫的話沒有太多抽象的概念,也很好懂,
我會建議寫的時候想像每個方法是生產線上的處理站,每一個步驟都是一個方法,一樣的東西進去會有一樣的結果

洋芋片流程圖
https://ithelp.ithome.com.tw/upload/images/20220911/20141054dJoBlu5TAj.png

定義好的方法應該要可以這樣被使用

chips =
  potato
  |> peel()
  |> slice()
  |> fry()
  |> season()
  |> pack()

Module 模組

所有的方法都必須要被定義在模組裡面
我們可以用 defmodule 來定義模組,並在 doend 裡寫模組內容
模組名稱全部都是大寫開頭

defmodule Greet do
  # 模組內容
end

長的名字用大駝峰式命名法(upper camel case)

defmodule AnotherModuleWithALongName do
end

可用 . 來分層,常常用來跟資料夾同步

defmodule BlogWeb.Notes.Note do
end

Function 方法(函式)

方法使用 def 定義,接著 snake case 的方法名稱,並在 doend 裡寫方法內容

defmodule Greet do
  def say_hi do
    "HI"
  end
end

say_hi()
#=> "HI"

方法變數可以用 () 加在方法後

defmodule Greet do
  def say_hi(name) do
    "HI #{name}"
  end

  def rectangle_area(width, height) do
    width * height
  end
end

say_hi("Coco")
#=> "HI Coco"

方法會自動回傳最後一行的結果

defmodule Greet do
  def say_hi do
    "foo"
    "bar"
    "HI"
  end
end

Greet.say_hi()
#=> "HI"

|> Pipe Operator 管線運算子

pipe |> 是把左邊的東西當成第一個變數待帶給右邊的方法
以下兩個是一樣的

say_hi("Jimmy")

"Jimmy" |> say_hi()

早些提到的洋芋片生產線流程大量用了 pipe

chips =
  potato
  |> peel()
  |> slice()
  |> fry()
  |> season()
  |> pack()

如果沒有用的話要改寫成這樣 有點難看

chips = pack(season(fry(slice(peel(potato)))))

或是改寫成這樣 有點多餘

peeled = peel(potato)
sliced = slice(peeled)
fried = fry(sliced)
seasoned = season(fried)
chips = pack(seasoned)

上一篇
{03, Elixir, "變數與型別"}
下一篇
{05, Elixir, "Pattern matching (模式比對)"}
系列文
速成 Phoenix, 2022年最受喜愛框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言