LoginSignup
8
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-18

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

最後に

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

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

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

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9