どうやらRubyでは10.times
と書くと0~10で反復可能なコードが書けるそうです。
jsでもやってみます。
const hello5 = 5 . times.map(() => 'hello')
console.log(hello5)
// => [ 'hello', 'hello', 'hello', 'hello', 'hello' ]
const list = 6 . times.map(v => v * 2)
console.log(list)
// => [ 0, 2, 4, 6, 8, 10 ]
これはProxyを使えば簡単です。
const handler = {
get(target, propKey, receiver) {
if (propKey === 'times') {
return [...Array(Number(receiver)).keys()]
}
return Reflect.get(target, propKey, receiver)
}
}
const proxy = new Proxy(Object.prototype, handler)
Object.setPrototypeOf(Number.prototype, proxy)
Proxyについては以下の資料でも読めばいいと思いますが、一度動かせばなんとなくわかるので読まなくてもいいと思います。
もちろん配列のようにアクセスしても動きます。
for (let i of 10['times']) {
console.log(i + 1)
}
// => 1
// => 2
// => 3
// => 4
// => 5
// => 6
// => 7
// => 8
// => 9
// => 10
キモいですね。
以下のコードをChrome Devtoolを開いて貼り付ければ動作確認できます。
const handler = {
get(target, propKey, receiver) {
if (propKey === 'times') {
const first = Number(receiver)
return [...Array(first).keys()]
}
return Reflect.get(target, propKey, receiver)
}
}
const proxy = new Proxy(Object.prototype, handler)
Object.setPrototypeOf(Number.prototype, proxy)
const hello5 = 5 . times.map(() => 'hello')
console.log(hello5)
const list = 6 . times.map(v => v * 2)
console.log(list)
for (let i of 10['times']) {
console.log(i + 1)
}
しかしまあObject.setPrototypeOf
の乱用は避けた方が無難でしょう。
— あかめ@🍆.js (@akameco) June 27, 2018
色々Proxy
でキモいことをやってみると楽しいと思います。