我能定义我自己的吗;如有的话;ruby中的语法?

我能定义我自己的吗;如有的话;ruby中的语法?,ruby,Ruby,我经常写这样的东西: val if val && !val.empty? val if_any 我是否可以更简洁地将此语法定义为: val if val && !val.empty? val if_any 或 ?是否有val.blank irb(main):008:0> ''.blank? => true irb(main):009:0> ' '.blank? => true irb(main):010:0> nil.

我经常写这样的东西:

val if val && !val.empty?
val if_any 
我是否可以更简洁地将此语法定义为:

val if val && !val.empty?
val if_any 

是否有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

返回实际值的Object方法的细微变化

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

编辑:嗯,在再次看了这个之后,我想我不会在方法名中使用问号,因为它违反了返回布尔值的ruby约定

谢谢。这很有帮助。但我想探索ruby的元编程灵活性,以定义自定义语法。我有点期待像LISP的macro way这样的解决方案。顺便说一句,这有点令人惊讶。false.blank?返回true。false、nil或空字符串/数组(或空白数组)。是否为空?是rails方法,是的。空白?的别名是否为空?空的代码?在导轨中有:def empty;全部的{| k,v | v&&v.empty?};我还没有真正做到这一点,但为什么不改变活动记录库呢?我非常确定它是很容易实现的。我认为应该为
字符串
数组
和其他类定义它,因为它会为这些对象提供error
NoMethod error empty?
,例如,
1.any?
给出
NoMethod错误为空?
。如果它不是方法
any?
就可以了……这不是一件大事,但只是注意到了……我相信目标是返回值,如果它不是空的,不是真的或假的。