[#118346] [Ruby master Bug#20586] Some filesystem calls in dir.c are missing error handling and can return incorrect results if interrupted — "ivoanjo (Ivo Anjo) via ruby-core" <ruby-core@...>
Issue #20586 has been reported by ivoanjo (Ivo Anjo).
13 messages
2024/06/19
[ruby-core:118376] [Ruby master Feature#18762] Add an Array#undigits that compliments Integer#digits
From:
"inopinatus (Joshua GOODALL) via ruby-core" <ruby-core@...>
Date:
2024-06-23 16:58:49 UTC
List:
ruby-core #118376
Issue #18762 has been updated by inopinatus (Joshua GOODALL).
I'll speak up for this feature. Whilst writing a base58 encoder/decoder today, I was surprised by the lack of an inverse to Integer#digits. In my benchmarking the reduce/inject variant is considerably faster than the sum variant, especially when we get into bignum territory.
However, for consistency with other conversions, `Integer(array, base)` should work too, as `Integer(string, base)` currently does. The latter is already special-cased, so that could be extended to handle an array even if the method above doesn't end up as `Array#to_i`.
----------------------------------------
Feature #18762: Add an Array#undigits that compliments Integer#digits
https://bugs.ruby-lang.org/issues/18762#change-108888
* Author: shan (Shannon Skipper)
* Status: Open
----------------------------------------
I've found Integer#digits convenient and useful but several times have needed to go from the place-value notation back to an Integer after manipulation and wished there was a complimentary Array#undigits.
``` ruby
class Array
def undigits(base = 10)
each_with_index.sum do |digit, exponent|
digit * base**exponent
end
end
end
42.digits.undigits
#=> 42
42.digits(16).undigits(16)
#=> 42
```
Below is my stab at a Ruby implementation with behavior mirroring Integer#digits.
``` ruby
class Array
def undigits(base = 10)
base_int = base.to_int
raise TypeError, "wrong argument type #{base_int.class} (expected Integer)" unless base_int.is_a?(Integer)
raise ArgumentError, 'negative radix' if base_int.negative?
raise ArgumentError, "invalid radix #{base_int}" if base_int < 2
each_with_index.sum do |digit, exponent|
raise MathDomainError, 'out of domain' if digit.negative?
digit * base_int**exponent
end
end
end
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/