def get_token
self.class.precedence.each do |token|
if val = send(token)
return val
end
end
error 'syntax error'
end
Refactorings
No refactoring yet !
Mortice
November 13, 2009, November 13, 2009 17:21, permalink
There's some discussion about a proposed iterator to do just this kind of thing on ruby-talk at the moment. I guess your code would end up looking something like this with the new iterator added.
#find_yield definition by Intransition on ruby-talk mailing list
module Enumerable
def find_yield(fallback = nil)
each do |member|
result = yield(member)
return result if result
end
fallback
end
end
self.class.precedence.find_yield {|token| send(token)} || error 'syntax error'
Ben Marini
November 13, 2009, November 13, 2009 21:31, permalink
Sounds like something you implement nicely in Ruby 1.9 using a lazy enumerator:
http://www.michaelharrison.ws/weblog/?p=163
Tj Holowaychuk
November 13, 2009, November 13, 2009 22:27, permalink
ya an enumerator would work fine, this is 1.8.x tho
Muke Tever
November 14, 2009, November 14, 2009 17:07, permalink
I think you *could* use find, if you really wanted to; just move 'val' outside of the find block's scope.
def get_token
val = nil
self.class.precedence.find {|token| val = send(token) }
val || error('syntax error')
end
# with val in the method signature you could, say,
# specify a fallback value instead of an error sometimes
# (if that makes sense in this context; I don't know)
def get_token(val=nil)
self.class.precedence.find {|token| if x = send(token) then val = x end }
val || error('syntax error')
end
Magnus Holm
November 16, 2009, November 16, 2009 22:13, permalink
def get_token
self.class.precedence.each { |token| return send(token) || next }
error('syntax error')
end
Everything else in my lib is pretty elegant, however this part bugs me. I cant use #find since I need the value the method send(token) returns, not the token name itself. Is there a baked in iterator that I forgot about that would work good here?