kotlinは、kotolin と書き間違えるぐらいの初心者。
Java もよく知らない。
手元の処理系
- ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
- Kotlin version 1.1.2-2
で確認している
#長さとか
##長さ
ruby
ary_len = [1,2,3].size # [1,2,3].length でもいい
hash_len = {a:1}.size # {a:1}.length でもいい
string_len = "hoge".size # "hoge".length でもいい
range_len = (1..9).size # Range#length はない。
kotlin
var ary_len = listOf(1,2,3).size
var dic_len = mapOf( 1 to 2, 3 to 4 ).size
var string_len = "hoge".length
Kotlin の Range の長さのとり方がわからない。
##範囲
Kotlin の Range は面白いんだけど、ここでは控えめに。
ruby
(1..10) # 1から10。両端含む。
(1...10) # 1以上10未満。
(1..10)===5 # true
kotlin
(1..10) // 1から10。両端含む。
(1 until 10) // 1以上10未満。
5 in (1..10) // true
Object の周辺
型
ruby
[].class #=> Array
1.class #=> Integer
[1,1.0,1r,1i].map{ |x| x.is_a?( Numeric ) } #=> [true, true, true, true]
kotlin
println(listOf(1).javaClass)//class java.util.Collections$SingletonList
println(1.javaClass)//int
println( listOf(1,2.0,"3").map { it is String}) //=> [false,false,true]
比較
ruby
[]==[] #=> true 普通の比較
[].equal?([]) #=> false 同じオブジェクトを指しているかどうか
kotlin
println( listOf(1)==listOf(1)) //=> true 同値かどうか
println( listOf(1)===listOf(1)) //=> false 同一オブジェクトかどうか
文字列化
ruby
"hoge".to_s #=> 「hoge」
"hoge".inspect #=> 「"hoge"」
python3
var s:String = listOf(1,2,3).toString() //=> [1, 2, 3]
kotlin に inspect はあるのだろうか。
文字列処理
join / joinToString
ruby
[1,2,3].join(",") #=> "1,2,3"
kotlin
listOf(1,2,3).joinToString(",") //=> "1,2,3"
split
ruby
"1a23b34c56".split(/[a-z]/) #=> ["1", "23", "34", "56"]
kotlin
"1a23b34c45".split( Regex ("[a-z]") ) //=> ["1", "23", "34", "45"]
わりと面倒くさい。正規表現リテラルはないので、バックスラッシュを重ねる必要があったり。
see http://qiita.com/nonylene/items/295b481330cd0471dd76
配列とか列挙の周辺
連想配列
ruby
m={1=>2,3=>4}
p m[1] #=> 2
m[5]=6
p m #=> => {1=>2, 3=>4, 5=>6}
kotlin
var m = mutableMapOf(1 to 2, 3 to 4)
println( m[1]) //=> 2
m[5]=6
println(m) // => {1=2, 3=4, 5=6}
kotlin は、mapOf
で作った連想配列は書き換えられない(不正確な表現)。
書き換えたければ mutableMapOf
で作る。
each / forEach
ruby
[1,2,3].each{ |a| print a } #=> 123
kotlin
listOf(1,2,3).forEach{ print(it) } //=> 123
map / map
ruby
[1,2,3].map{ |a| a*2 } #=> [2, 4, 6]
kotlin
print(listOf(1,2,3).map{ it*2 }) //=> [2, 4, 6]
inject / reduce
ruby
[1,2,3,4].inject(0){|a,b| a+b } #=> 10
kotlin
print(listOf(1, 2, 3, 4).reduce{ acc, i -> acc + i }) //=> 10
kotlin の reduce には初期値が入れられない模様。
最後に
今日のところはこれぐらいで。
まだ加筆予定だけど、仕事で使っているわけではないのであんまり増えないかも。
もっと良い書き方があるよ! という意見募集。