Help us understand the problem. What is going on with this article?

ruby でこう書くのは、kotlin ならこう書く、のメモ

More than 1 year has passed since last update.

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 には初期値が入れられない模様。

最後に

今日のところはこれぐらいで。

まだ加筆予定だけど、仕事で使っているわけではないのであんまり増えないかも。

もっと良い書き方があるよ! という意見募集。

Nabetani
横浜へなちょこプログラミング勉強会をやっていました。 / CodeIQ の出題者でした。 / 日経 WinPC に連載を持っていました(名義が違うけど) / Yokohama rb に半分ぐらい参加しています。 / twitter : http://twitter.com/Nabetani
https://nabetani.hatenadiary.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away