Rubyでメソッドを定義する

Rubyの事を忘れないように、週に1回はRubyでツールを作る事にしている。
毎週作っている割に、やっと巡ってきたメソッドの定義の仕方。

Rubyでメソッドの定義

特に難しいことはなかった。

def my_func(arg1, arg2="Ruby")
    puts "#{arg1}, #{arg2} !"
    return arg1
end

my_func "Hello"
my_func "Hello", "JRuby"

my_funcが作成され、arg2はオプションになる。
戻り値はreturnで返す。returnは省略可能(Perlみたい)。

名前付き引数

def my_func(greet:, lang: "Ruby")
  puts "#{greet}, #{lang}!"
  return greet
end

my_func greet: "Hello"
my_func greet: "Hello", lang: "JRuby"

名前付き引数も使える。しかし、Pythonとは異なり、名前付き引数は必ず名前を指定しなくてはいけない。順番と名前をそれぞれ考慮してくれる訳では無いようだ。

まとめ

関数呼び出しにカッコをつけなくて良いのは、慣れると便利な気がしてきた。
今までは、カッコが当たり前だったのに、なくて良いとわかると付ける気がしない。Perlを思い出してきた。

同じタグの記事
同じカテゴリの記事

Ruby公式サイトの他言語とRubyの違いを眺めてみて

Ruby公式サイトの他の言語とRubyの違いを眺めてみて

www.ruby-lang.orgの多言語からのRuby入門が面白かった。
他の言語と同じところ、違うところがまとめられている。
個人的にPythonとJavaが得意で、そこを眺めてみたが、こういう風にまとめられていると導入しやすいと思う。
気になったところを書き出してみる。

irbと言われる対話型の実行環境がある

この環境はとても便利。使ったことのないクラスを使う必要がある場合や、普段から使っているけどなかなか覚えられないsubstringの区切り位置を確認するときに重宝する。
文字列の2バイト目から5バイト欲しいときはどう指定するのか。対話画面があるとすぐに試せる。

今でこそ、Javaにもjshellができたが、それまでは小さなプログラムを作って、コンパイルして実行する必要があった。Eclipse 2の頃はスクラッチパットがあったが、今はどうなのだろう。
irbでいろいろ試しながら、スクリプトを作ることにしよう。

三重引用符で複数行リテラル

これは、Pythonでも好きなところ。Rubyでも使えるのは良いことだ。
Javaだったら、StringBuilder使うのも面倒なので、Propertiesにでも書き出しておくだろうか。

リストは[]、辞書は{}

PythonのTupleは無いようだ。あまり使わないから、どっちらでもよいが。

メソッド呼び出しの括弧はオプション

さすがPerlの次の言語だ。メソッドの呼び出しに括弧がいらない。Perlもそうであった。
昔のVBの様に戻り値の無いときの利用なら許容範囲かと思う。

True、Falseはtrueとfalse。Noneの変わりはnil。

PythonもTrue、Falseはtrueとfalseになってくれれば良いのに。
Noneとnilはnullになってしまえば良いのに。

importの代わりにrequireを使う

JRubyから始めたので、requireとimportの違いがいまだによくわからない。

MyClass.new()

インスタンスの作成が独特。new()もメソッドの扱いなのだろうか。
PythonならMyClass()。Javaならnew MyClass()。知ってしまえば、どれでも大した差はないか。

==とequals()

Rubyで文字列の比較は==。Javaならequals。
Rubyにはequalsは無く、equal?がある。しかしRubyのequal?はオブジェクトの比較用。Javaとは逆の動きだ。

まとめ

RubyもPythonもJavaも違いがあって面白い。
本当は何か1つの言語を極めるべきなのかもしれないけど、同じ言語ばかりだと飽きてしまうので、あれもこれも使っていきたいと思っている。

同じタグの記事
同じカテゴリの記事

JRubyを久しぶりに

JRubyを久しぶりに

ツールを作る。いつもの通りJythonを使おうと思ったが、時間もあるのでJRubyにした。
以前は、JavaのAPIを繰り返し呼び出すだけの簡単なプログラムだったが、今回は少しだけJRubyでロジックも書いてみた。穴にはまった。

定数クラスから定数を取得するときは::を使う

java.awt.Colorから色を取得しようと思った。

1
2
3
4
5
6
7
8
9
10
11
import java.awt.Color
import java.awt.image.BufferedImage

bi = BufferedImage.new(100, 100, BufferedImage::TYPE_INT_RGB)
g = bi.createGraphics()

g.color = Color.BLUE
# → エラー

g.color = Color::BLUE
# → OK

Rubyでは、メソッドの呼び出しのみを.(ピリオド)で行い、その他の呼び出しは::(コロン2つ)を利用するようだ。
メソッドの呼び出しは.でも::でもどちらでも良いらしい。
java.awt.Colorの.はピリオドでも良いようだ。しかし、java.awt.Color::BLUEは::だ。なんだこれ。

Javaクラスのimportはimport

Rubyの外部ファイル読み込みはrequire。
だからといって、Javaのクラスがすべて外部ファイルで定義されているわけではないので、requireではいけない。javaと同じようにimportを利用する。

1
2
3
4
5
6
7
8
require "java"
# → これはJRubyを組むときは読んでおいた方が良いらしい。

require "java.awt.Color"
# → エラー

import "java.awt.Color"
# → OK

単純なセッター、ゲッターはプロパティの様に呼び出しても良い

これは、なかなか面白い。
また、キャメルケースなメソッドをスネークケースに変換しても呼び出せる。
メソッドの括弧も省略できる。

1
2
3
4
5
6
7
8
9
10
11
g.setColor(Color::RED)
# → Java的。しかしエラーではない。

g.set_color(Color::GREEN)
# → まだJava的。しかしエラーではない。

g.set_color Color::BLUE
# → もう少し。しかしエラーではない。

g.color = Color::YELLOW
# → OK

ゲッター、セッターをプロパティとして扱えるのはKotlinっぽい。

ブロックコメント

ブロックコメントは

1
=begin

から

1
=end

に適用される。
よく、ソースの先頭に覚書を残すので、ブロックコメントの使い方は覚えておかなくては。
しかし、ネットをみると、ブロックコメントはあまり使わないらしい。
行コメントの#を使うようだ。今はIDEが良くできているので、各行に#を補ってくれるのだろう。
また、Javaでも言われているが、ブロックコメントの中にブロックコメントは書けないので、そういう時のためにブロックコメントは残しておくのだろうか。

しかし、Pythonと同様に複数行コメントに三重引用符が使える。
これでコメントを残しても良いのかな?

スクリプト引数

ARGVに引数が入っている。ARGVは配列。sizeやlengthで引数の数を確認できる。

1
2
3
4
5
puts ARGV.size
puts ARGV.length
if ARGV.size > 0
    puts ARGV[0]
end

また、$0にスクリプト(コマンド)そのものが入っている。

1
2
puts $0
# → JRubyのirbで実行したらjirbが返ってきた。

まとめ

JRubyも良い言語だ。簡便に書けるし、実行速度も不足ない。
JythonとJRuby、どちらを選ぶかはなかなか悩む。

同じタグの記事
同じカテゴリの記事

macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか

macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか

Python

Mojave

1
2
3
Python 2.7.10 (default, Aug 17 2018, 17:41:52)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

High Sierra

1
2
3
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

Pythonのバージョンは変更なし。
コンパイラのバージョンは上がっている。

perl

Mojave

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

High Sierra

1
2
3
4
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

perlのバージョンは変わらない。

PHP

Mojave

1
2
3
PHP 7.1.19 (cli) (built: Aug 17 2018 18:03:17) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

High Sierra

1
2
3
PHP 7.1.16 (cli) (built: Mar 31 2018 02:59:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

細かいバージョンが上がっている。

Ruby

Mojave

1
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

High Sierra

1
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin17]

Rubyのバージョンは変わらない。

sqlite3

Mojave

1
SQLite version 3.24.0 2018-06-04 14:10:15

High Sierra

1
SQLite version 3.19.3 2017-06-27 16:48:08

細かいバージョンが上がっている。

まとめ

今回もPythonのバージョンアップはなかった。
macOSの何らかのプログラムがPython2に依存しているのだろうか。

同じタグの記事
同じカテゴリの記事