Feature #12752 closed
Unpacking a value from a binary requires additional '.first' Added by tagomoris (Satoshi Tagomori) about 9 years ago. Updated almost 9 years ago.
Description
When I parsed a binary protocol (msgpack) by String#unpack
, there are many similar expressions, like below:
str = io . read ( 1 ) length = str . unpack ( 'C' ). first case length when 4 data = io . read ( 4 ). unpack ( 'N' ). first # ...
I know that unpack
returns "1 or more" values, but I think there are too many cases to return just one object. Creating Array objects for return values requires additional cost to create Array object, and calling .first
.
I'm happy if I can write the code above like this:
str = io . read ( 1 ) length = str . unpack ( 'C' , 0 ) # index, or str.unpack('C', index: 0) case length when 4 data = io . read ( 4 ). unpack ( 'N' , 0 ) # ...
Description updated (diff ) There is more concise way:
length, = str.unpack('C')
You cannot use this in a method chain, though.
I actually understand your frustration, but I feel no difference between str.unpack('C', 0)
and str.unpack('C')[0]
.
-- Yusuke Endoh mame@ruby-lang.org
How about Array#unpack1
?
unpack1
looks so ad-hoc but surely is attractive.
Matz.
With a qualifier or multiple directives given, would it raise an ArgumentError or just go ahead with the process and only return the first value?
Akinori MUSHA wrote:
With a qualifier or multiple directives given, would it raise an ArgumentError or just go ahead with the process and only return the first value?
Just after processing the first value, it returns.
Status changed from Open to Closed Applied in changeset r56959.
String#unpack1 [Feature #12752 ]
Returns the first value of String#unpack.
Also available in: Atom PDF
Like 0 Like 0 Like 0 Like 0 Like 0 Like 0 Like 0 Like 0 Like 0