Ruby にあって Squeak Smalltalk にはない文字列操作


文字列クラスのメソッド数比較 に絡めて。

両者の共通項については、以前すでに Ruby との文字列操作の比較 で列挙しましたが、今回は差異(特に Ruby からの視点で…)を意識して整理してみました。


とりあえず、両者共通の機能を持つメソッドを抽出してみるとこんな感じ(一部ちょっと無理がありますが…(^_^;))。

#length , #size    ->    #size
#[]    ->    #at:
#[]=    ->    #at:put:
#+    ->    #,
#empty?    ->    #isEmpty
#reverse    ->    #reverse
#upcase    ->    #asUppercase
#upcase!    ->    #translateToUppercase
#downcase    ->    #asLowercase
#downcase!    ->    #translateToLowercase
#capitalize    ->    #capitalized
#to_i    ->    #asInteger
#to_str   ->   #asString
#to_sym, #intern    ->    #asSymbol
#each_byte    ->    #do:
#each_line    ->    #linesDo:
#include?    ->    #includes:
#delete    ->    #copyWithout:
#slice    ->    #copyFrom:to:
#strip    ->    #withBlanksTrimmed
#rstrip    ->    #withoutTrailingBlanks
#lstrip    ->    #withoutLeadingDigits
#chomp    ->    #withoutTrailingBlanks
#chop    ->    #allButLast
#rjust, #ljust    ->    #padded:to:with:
#<    ->    #<
#>    ->    #>
#>=    ->    #>=
#<=    ->    #<=
#<=>    ->    #compare:caseSensitive:
#casecmp    ->    #compare:


目を引くところでは、Ruby の String には Smalltalk の #become: に相当する #replace なんてぇのがあること。


逆になんだかなーと思ったのは、Ruby 1.8 の String クラスにはエラーを出さずに動きはするけれど、意味はなさないメソッド群(おそらく Enumerable から継承された…)が少なからず存在すること。なお、これらのメソッド群は、Ruby 1.9 では文字列に対しては使えなくなっています。ご指摘の通り、これは私の勘違いで、Ruby 1.8 の Enumerable は行単位で正常に動作します。スミマセン。)Squeak Smalltalk で気持ち的に対応するメソッドや操作を括弧でくくって示しました。

#each    (-> #linesDo: )
#collect, #map    (-> 行へ分解後 #collect: )
#select, #find_all    (-> 行へ分解後 #sellect: )
#reject    (-> 行へ分解後 #reject: )
#grep
#detect, #find    (-> 行へ分解後 #detect: )
#inject    (-> 行へ分解後 #inject:into: )
#max    (-> 行へ分解後 #detectMax: )
#min    (-> 行へ分解後 #detectMin: )
#all?    (-> 行へ分解後 #allSatisfy: )
#any?    (-> 行へ分解後 #anySatisfy: )
#member?    (-> 行へ分解後 #include: )
#each_with_index    (-> 行へ分解後 #doWithIndex: )
#sort_by
#sort    (-> 行へ分解後 #sortBy: )
#entries    (-> subStrings: {Character lf} などで行に分解 )
#zip
#partition    (-> 行へ分解後 #groupBy:having: )

前置きはこのくらいにして、以下に本題。

大別すると、Ruby の Array がサイズ可変であることを利用したメソッドや、正規表現や tr(1) 形式のサポート、UNIX のコマンドに対応した便利メソッドなどが Squeak Smalltalk には欠けています。あと、Ruby には破壊的にサイズ変更操作を行なうメソッドが比較的充実しているように感じられました。なお、多言語文字列操作関連は省いてあります。

▼ サイズを変更するもの

Squeak Smalltalk の文字列はサイズ固定なので、レシーバ文字列それ自体に対してサイズを変更する操作はできない。

#<<
#concat
#insert
#strip!
#rstrip!
#lstrip!
#chop!
#chomp!
#delete!
#slice!

▼ “連なるもの”の生成や #between?

Squeak Smalltalk には、連なるもの(継ぐのも)を生成したり、それへ置き換えるといった操作はない。また、Squeak Smalltalk の String は、Magnitude(Ruby でいうところの Comparable)を継承していないため Magnitude>>#between:and: は文字列に対しては使えない。

#succ
#succ!
#next
#next!
#upto
#between?

▼ 変換操作など

#%    ->    #format:
#dump
#unpack
#crypt
#sum
#*
#center
#hex, #oct    ->    #Number>>#readFrom:base:
#to_f    ->    Float>>#readFrom:
#swapcase
#swapcase!

正規表現や tr(1) 形式を用いた検索、置換、変換操作

Squeak Smalltalk正規表現や tr(1) 形式を受け付けないので、これらの操作はできないか類似の操作として限定される。

#gsub    ->    #copyReplaceAll:with:
#gsub!
#sub
#sub!
#match
#scan
#split    ->    #subStrings:
#tr    ->    #translateWith:
#tr!    ->    #replaceAll:with:
#squeeze
#squeeze!
#tr_s
#tr_s!
#index    ->    #indexOf: , #indexOfAnyOf: , #indexOfSubCollection: 
#rindex    ->    #lastIndexOf:
#count

Squeak Smalltalk には破壊的操作版がないメソッド

#reverse!
#capitalize!