Ramda 也如原生 ECMAScript 提供 slice()
,唯 Ramda 的 slice()
是以 FP 形式呈現。
Version
macOS Mojave 10.15.2
VS Code 1.41.1
Quokka 1.0.275
Ramda 0.26.1
Imperative
let data = 'FP in JavaScript'
let slice = begin => end => str => {
let result = ''
for(let i = 0; i < str.length; i++)
if (i >= begin && i < end)
result += str[i]
return result
}
slice(6)(16)(data) // ?
Imperative 會先建立欲回傳的 result
string,使用 for
loop 搭配 if
判斷,若 index
在傳進的 begin
與 end
之中,則塞進 result
中。
slice()
let data = 'FP in JavaScript'
let slice = begin => end => str => str.slice(begin, end)
slice(6)(16)(data) // ?
ECMAScript 原生的 String.prototype
已內建 slice()
,可直接使用。
Functional
import { invoker } from 'ramda'
let data = 'FP in JavaScript'
let slice = invoker(2, 'slice')
slice(6)(16)(data) // ?
亦可使用 invoker()
調用 String.prototype
的 slice()
。
Ramda
import { slice } from 'ramda'
let data = 'FP in JavaScript'
slice(6)(16)(data) // ?
Ramda 亦內建 slice()
,可直接使用。
slice()
Number -> Number -> String -> String
回傳 string 的一部分
Number
:string 的起始 index
Number
:string 的結束 index (但不包含)
[a]
:data 為 string
[a]
:回傳新的部分 string
import { slice } from 'ramda'
let data = 'FP in JavaScript'
slice(6)(Infinity)(data) // ?
若要回傳到 array 最後一個 element,直接傳入 Infinity
即可。
在
Array.prototype.slice()
只要省略不傳即可,因為 ECMAScript 支援 optional parameter,預設就是最後一個 element;但 Ramda 不支援 optional parameter,而支援 partial application,因此一定要明確傳入Infinity
import { slice } from 'ramda'
let data = 'FP in JavaScript'
slice(6)(-6)(data) // ?
Index 也可以傳入負數,其中 -1
就是最後一個 element,-2
就是倒數第二個 element,以此類推。
Array.prototype.slice()
的 index 也支援負數
import { slice } from 'ramda'
let data = 'FP in JavaScript'
slice(-10)(-6)(data) // ?
也可以兩個參數都是負數。
Conclusion
slice()
底層也是呼叫String.prototype.slice()
,因此所有特性與原生的slice()
相同,唯原生的slice()
是以 OOP 設計,slice()
為 string 的 method;而 Ramda 的slice()
是以 FP 設計,string 以參數傳入,且在最後一個參數,方便做 point-free- 由於 Ramda 不支援 optional parameter,而支援 partial application,因此第二個參數不能省略,若要抓到最後一個 element,要明確傳入
Infinity