題目:
[(6 級) Schrödinger's Boolean]
(https://www.codewars.com/kata/5a5f9f80f5dc3f942b002309)
一個值能同時為 true
和 false
嗎?
定義 omnibool
讓其在下方的情況下回傳 true
omnibool == true && omnibool == false
Ruby 解法:
omnibool = Object.new
def omnibool.==(bool)
true
end
心得:
一開始有嘗試過使用邏輯短路的方式解題omnibool = false && true
omnibool 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()
裡面動手腳囉!