T
trans. (T. Onoma)
Is there a reverse #succ for String? If not, could there be?
T.
T.
trans. (T. Onoma) said:Is there a reverse #succ for String? If not, could there be?
| It's up now.
|
| The list archive hosted in the Nagaoka University of Technology, which
| is recently hit by severe earthquake in Niigata prefecture, Japan.
| The archive maintainer, Shin-ichiro Hara, told us that he and his
| family were safe. So were the machines at his office.
trans. (T. Onoma) said:| > Is there a reverse #succ for String? If not, could there be?
|
| It's one of those things that looks easy until you try it.
|
| There are too many "edge cases" that require judgment about how
| to generate the next value.
|
| Search the archives, it's been discussed off and on for five years.
Thanks and yes the archives are back up. I found a few hits. I see the
problem. Though, I don't really care if it's a one-to-one match to #succ. I
would just prefer that my Range#reverse_each method doesn't blow up
Certainly there must a basic #pred method that makes sense.
Then again how much use does String#succ actually get? And what for? Can
anyone really give a use case truly dependent on the specific current
behavior? Would it make more sense if it were simply an ascii "dial", within
a particular range of characters? And perhaps too that particular range could
have a redefinable specal global.
T.
trans. (T. Onoma) said:(Thanks to all who have taken some time with this and String Range thread.)
17 am, Hal Fulton wrote:
| > | trans. (T. Onoma) wrote:
| > | > Is there a reverse #succ for String? If not, could there be?
| > |
| > | It's one of those things that looks easy until you try it.
| > |
| > | There are too many "edge cases" that require judgment about how
| > | to generate the next value.
| > |
| > | Search the archives, it's been discussed off and on for five years.
| >
| > Thanks and yes the archives are back up. I found a few hits. I see the
| > problem. Though, I don't really care if it's a one-to-one match to #succ.
| > I would just prefer that my Range#reverse_each method doesn't blow up
| > Certainly there must a basic #pred method that makes sense.
| >
| > Then again how much use does String#succ actually get? And what for? Can
| > anyone really give a use case truly dependent on the specific current
| > behavior? Would it make more sense if it were simply an ascii "dial",
| > within a particular range of characters? And perhaps too that particular
| > range could have a redefinable specal global.
| >
| > T.
|
| #pred leads to the gates of madness.
| Mr. Fulton is right in that it doesnt sound too hard to
| implement until you try it.
Almost. I managed to dig up a working #pred method in ruby-talk archives. I
think robert wrote it (have to check to be sure), but it works well enough,
given that it would probably never be used![]()
| I have used String#succ to ummm, 'test', the strength of passwords.
| The current implementation doesnt allow that if a password uses more
| printable chars than letters or numbers.
|
| An ascii 'dial' with a definable, or redefinable, range would be just
| perfect.
| ascci_succ ?
| 'z9'.succ => 'aa0'
| 'z9'.a_succ => 'z:'
|
| I just wonder if it should be a 'wheel' or 'dial', or if it should just
| have borders. 'a'.. 'the_end_of_the_line' of printable char range.
It has become increasing apparent to me that string ranges are of very limited
use --primarily they seemed to be used just to get a list of letters a-z.
While I'm sure there are at least a couple cases out there somewhere in which
the current behavior is quite useful, a number of of alternates have been
suggested to make it even more so; the general "dial" being one of them.
Another interesting idea is dictionary-order given a "depth" parameter. For
instance:
'a'.succ(1) #=> 'b'
'z'.succ(1) #=> nil (nothing after z of depth 1)
'a'.succ(2) #=> 'aa'
'aa'.succ(2) #=> 'ab'
'az'.succ(2) #=> 'b'
'b'.succ(2) #=> 'ba'
and so forth. Of course other methods would require adjustment to handle the
parameter, but that is fairly easy to do. No doubt there are other variations
of a more useful #succ as well.
Clearly what would be better is some sort of Iterator / Enumerator /
Generator, perhaps provided by a String class method to which parameters can
be passed to determine behavior --or perhaps a few such methods. For example,
one method might be as above:
sg = String.dict_enum('A-B', 2)
sg.to_a
#=> [ 'A', 'AA', 'AB', 'B', 'BA', 'BB' ]
Speaking of which, if any one has a general purpose string generator, I would
really love to get a hold of it.
My overall conclusion is that string ranges have held back the Range class. On
suby-ruby we have been able to get Range to behave uniformally even with
string ranges. This required using an alternative comparesion method (#cmp
instead of #<=>). But given the limited usefulness of the current String#succ
in contrast to the other useful possibilities for generating a list of
ordered strings, plus the "headache" it causes Range to support it, it seems
to me that it might be better just to let it go. Besides, it is easy enough
to do:
?a..?z
If one needs simple character enumeration.
Opinions on this are greatly welcome.
T.
P.S. Of course, if anyone can figure out a way to create a one-to-one
correspondence between strings and floats, then we'd have whole new ball game
on our hands!
Want to reply to this thread or ask your own question?
You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.