2011-03-19 75 views

回答

1

对象方法的一个细微变化返回实际值。

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 

编辑:嗯,这又看后,我想我不会在方法名称中使用问号,因为它违背了返回布尔的红宝石约定。

4

有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 
+0

谢谢。这有很大帮助。但我想探索ruby的元编程灵活性来定义自定义语法。我期望像LISP的宏观方式一样的解决方案。 – lkahtz 2011-03-19 06:13:04

+0

顺便说一句,它有点令人惊讶的false.blank?返回true。 – lkahtz 2011-03-19 06:13:36

+0

false或null或空字符串/数组(或空白数组)。 – Spyros 2011-03-19 06:15:11

2

不,我不相信Ruby允许您以这种方式扩展语法。您可以得到的最接近的方法是添加对象的方法:

class Object 
    def any? 
    !!self && !self.empty? 
    end 
end 

"hi".any? # => true 
[].any? # => false 
nil.any? # => false 

if x.any? 
    # do something 
end 
+0

还没有真正做到这一点,但为什么不改变活动记录库?我很确定它很容易实现。 – Spyros 2011-03-19 06:13:37

+0

辉煌。这是非常有用的......我看不出任何理由投票...... – lkahtz 2011-03-19 06:20:24

+0

我认为你应该为'String','Array'定义它,而其他类是'empty?'被定义为它会给出错误' NoMethod错误为空?'对于那些对象...例如'1.any?'给出了'NoMethod Error empty?'..如果它不是方法'任何?'没关系...不是一件大事,只是注意到.. – rubyprince 2011-03-19 09:44:07

相关问题