多くの言語では,1 文字が文字列中にあるかどうかは簡単な関数で調べることができる。
たとえば,Python なら
"abcdefg".find("c") # 2
"abcdefg".find("z") # -1 存在しない場合
Julia では,
occursin("c", "abcdefg") # true
occursin("xyz", "abcdefg") # false
Julia の indexin(a, b) は a が b に含まれないときには nothing を返すという,ありがたいんだかありがたくないんだか,微妙な仕様になっている。
そこで,以下のような find 関数を実装してみた。
indexin() の a, b は配列でもよいのだけど,find() の第1引数は 文字型(Char)もしくは長さ1の文字列,第2引数は文字列または整数に限定する。引数の組み合わせとして4通りあるので,find() も 4 通り書き,最終的に5番目に定義する関数が呼ばれる。5番目の関数の第1引数は Char型,第2引数は Vector{Char} である。indexin() を呼び,結果が nothing のときには 0 を返すようにしている。
find(c::Char, n::Int) = find(c, string(n))
find(c::Char, s::String) = find(c, Char[s...])
find(s::String, n::Int) = find(Char(s...), string(n))
find(s::String, ss::String) = find(Char(s...), Char[ss...])
function find(c::Char, cc::Vector{Char})
x = indexin(c, cc)[1]
isnothing.(x) ? 0 : x
end
この関数群がどのように働くかは実行例を見れば一目瞭然。
find('3', 123) # 3
find('4', 123) # 0
find('3', "123") # 3
find('4', "123") # 0
find("3", 123) # 3
find("4", 123) # 0
find("3", "123") # 3
find("4", "123") # 0