題目:
[(6 級) Schrödinger's Boolean]
(https://www.codewars.com/kata/5a5f9f80f5dc3f942b002309)
一個值能同時為 true 和 false 嗎?
定義 omnibool 讓其在下方的情況下回傳 trueomnibool == true && omnibool == false
Ruby 解法:
omnibool = Object.new
def omnibool.==(bool)
true
end
心得:
一開始有嘗試過使用邏輯短路的方式解題omnibool = false && trueomnibool false || true
想當然爾,將值直接指定給變數時沒辦法達成題目的條件
於是告訴自己換個方式思考
剛好最近做 Rails 專案時經常遇到從 params method 得到的回傳值是固定的
如果要對 params 中的內容進行操作,需要將回傳值指定給一個變數
前一陣子上課時龍哥和泰安老師都有提到 Ruby Object Model 這支影片
於是想到可以幫 omnibool 寫個 singleton method 複寫掉原本的 == 判斷方法
並且讓那個 singleton method 的回傳值永遠是 true 便能達成題目條件
JavaScript 解法:
const omnibool = {
value: true;
valueOf: () => {
this.value = !this.value;
return this.value
}
};
心得:
這個題目的 JavaScript 解法有一點點瑕疵
如果調換測試的題目順序的話就會失敗
對此我也沒有更好的解法
之前龍哥介紹過的 __proto__ 和 prototype
和 Kuro 大大的 008 讓我對這題有一些頭緒
JavaScript 的 == 的判斷會自動轉型 (超貼心)
而比對物件的情況下,會先透過物件的 valueOf() 方法先求得對應的數值
如果物件沒有 valueOf() 方法的話,則會透過 toString() 轉型再進行比較
也就是說我們可以在 valueOf() 裡面動手腳囉!