我經常寫類似:我可以在ruby中定義自己的「if any」語法嗎?
val if val && !val.empty?
我可以更簡明地定義這個語法是這樣的:
val if_any
或
val if any
?
我經常寫類似:我可以在ruby中定義自己的「if any」語法嗎?
val if val && !val.empty?
我可以更簡明地定義這個語法是這樣的:
val if_any
或
val if any
?
對象方法的一個細微變化返回實際值。
class Object
def if_any?
self if self && (!self.respond_to?(:empty?) || !self.empty?)
end
end
[].if_any? # => nil
[42].if_any? # => [42]
"".if_any? # => nil
"hi".if_any? # => "hi"
# and for the objects that don't define #empty?
nil.if_any? # => nil
42.if_any? # => 42
false.if_any? # => nil
true.if_any? # => true
編輯:嗯,這又看後,我想我不會在方法名稱中使用問號,因爲它違背了返回布爾的紅寶石約定。
有val.blank?
irb(main):008:0> ''.blank?
=> true
irb(main):009:0> ' '.blank?
=> true
irb(main):010:0> nil.blank?
=> true
irb(main):011:0> false.blank?
=> true
irb(main):012:0> 'whatever'.blank?
=> false
不,我不相信Ruby允許您以這種方式擴展語法。您可以得到的最接近的方法是添加對象的方法:
class Object
def any?
!!self && !self.empty?
end
end
"hi".any? # => true
[].any? # => false
nil.any? # => false
if x.any?
# do something
end
還沒有真正做到這一點,但爲什麼不改變活動記錄庫?我很確定它很容易實現。 – Spyros 2011-03-19 06:13:37
輝煌。這是非常有用的......我看不出任何理由投票...... – lkahtz 2011-03-19 06:20:24
我認爲你應該爲'String','Array'定義它,而其他類是'empty?'被定義爲它會給出錯誤' NoMethod錯誤爲空?'對於那些對象...例如'1.any?'給出了'NoMethod Error empty?'..如果它不是方法'任何?'沒關係...不是一件大事,只是注意到.. – rubyprince 2011-03-19 09:44:07
謝謝。這有很大幫助。但我想探索ruby的元編程靈活性來定義自定義語法。我期望像LISP的宏觀方式一樣的解決方案。 – lkahtz 2011-03-19 06:13:04
順便說一句,它有點令人驚訝的false.blank?返回true。 – lkahtz 2011-03-19 06:13:36
false或null或空字符串/數組(或空白數組)。 – Spyros 2011-03-19 06:15:11