craigeley
craigeley

Reputation: 352

Undefined method "each" in Ruby 2.0

The new Mac OS update moved the system Ruby up to 2.0, which is great, but now I'm seeing errors in a lot of my scripts that I don't know how to fix. Specifically, I had code that called for files using mdfind and then read them, like this:

files = %x{mdfind -onlyin /Users/Username/Dropbox/Tasks 'kMDItemContentModificationDate >= "$time.today(-1)"'}
files.each do |file|

Now I'm getting an error that says

undefined method `each' for #<String:0x007f83521865c8> (NoMethodError)"

It seems as if each now needs a qualifier. I tried each_line but that yielded additional errors down the line. Is there a simple replacement for this that I'm overlooking?

Upvotes: 0

Views: 976

Answers (1)

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230276

Ruby 1.8 used to have String#each which was doing implicit splitting.

each(separator=$/) {|substr| block } => str

Splits str using the supplied parameter as the record separator ($/ by default), passing each substring in turn to the supplied block. If a zero-length record separator is supplied, the string is split into paragraphs delimited by multiple successive newlines.

Explicit splitting should work in modern rubies, I believe.

files.split($/).each do |file|

Where $/ is newline char. You can use explicit char, since your script is not portable anyway.

files.split("\n").each do |file|

Update

or you can just use an alias of now-extinct each

files.each_line do |file|

Upvotes: 6

Related Questions