Crystal - Rubyと異なるアクセサの命名 #ruby #crystal

CrystalとRubyではアクセサ定義時のメソッド名（マクロ名）が異なります。

### :gem: Rubyの場合
下記のメソッドはModuleで定義されています。
<i class="fa fa-external-link" style="font-size:1em;"></i> [Module - るりま](http://docs.ruby-lang.org/ja/2.2.0/class/Module.html)

|--| <i class="fa fa-book" style="font-size:1em;"></i> 読み込み|<i class="fa fa-pencil" style="font-size:1em;"></i> 書き込み|メソッド名|
|:--:|:--:|:--:|:--|
| <i class="fa fa-book" style="font-size:1em;"></i><i class="fa fa-pencil" style="font-size:1em;"></i> |o|o|attr_accessor|
| <i class="fa fa-book" style="font-size:1em;"></i> |o|x|attr_reader|
| <i class="fa fa-pencil" style="font-size:1em;"></i> |x|o|attr_writer|

### <i class="fa fa-diamond" style="font-size:1em;"></i> Crystalの場合
下記のマクロはObjectで定義されています。
<i class="fa fa-external-link" style="font-size:1em;"></i> [Object - Crystal Docs](http://crystal-lang.org/api/Object.html)

|--| <i class="fa fa-book" style="font-size:1em;"></i> 読み込み|<i class="fa fa-pencil" style="font-size:1em;"></i> 書き込み|メソッド名|
|:--:|:--:|:--:|:--|
| <i class="fa fa-book" style="font-size:1em;"></i><i class="fa fa-pencil" style="font-size:1em;"></i> |o|o|property|
| <i class="fa fa-book" style="font-size:1em;"></i> |o|x|getter|
| <i class="fa fa-pencil" style="font-size:1em;"></i> |x|o|setter|

## <i class="fa fa-comments" style="font-size:1em;"></i> Crystal命名議論Issueより
>On the other hand, I never really liked attr_accessor, attr_reader and attr_writer.
>In every other language they are called property, getter and setter.

Issue全体を見てみたい方は以下より

<i class="fa fa-external-link" style="font-size:1em;"></i> [Issue651(method naming conventions ) - Crystal - GitHub](https://github.com/manastech/crystal/issues/651)

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### :gem: Rubyプログラム
```ruby
require 'pp'
class Person
  attr_accessor :name
  attr_reader :age
  attr_writer :hello
  def initialize(name, age)
    @name, @age = name, age
  end

  def say_hello
    puts @hello
  end
end

tanaka = Person.new('tanaka', 22)
pp tanaka                      # => #<Person:0x0000060031cdc8 @age=22, @name="tanaka">
pp tanaka.name                 # =>"tanaka"
pp tanaka.name = 'tanaka-kai'  # =>"tanaka-kai"
pp tanaka.age                  # =>22
# pp tanaka.age = 33 => Error
pp tanaka.hello = "hello"      # =>"hello"
tanaka.say_hello               # =>hello
```

### <i class="fa fa-code" style="font-size:1em;"></i> Crystalプログラム
```ruby
class Person
  property :name
  getter :age
  setter :hello
  def initialize(@name, @age)
    # crystalでは引数にインスタンス変数を指定すると、
    # そのまま値がインスタンス変数に設定される
  end

  def say_hello
    puts @hello
  end
end

tanaka = Person.new("tanaka", 22)
pp tanaka                      # => tanaka = #<Person:0x949ff90 @name="tanaka", @age=22, @hello=nil>
pp tanaka.name                 # =>tanaka.name = "tanaka"
pp tanaka.name = "tanaka-kai"  # =>tanaka.name = "tanaka-kai" = "tanaka-kai"
pp tanaka.age                  # =>tanaka.age = 22
# pp tanaka.age = 33 => Error
pp tanaka.hello = "hello"      # =>tanaka.hello = "hello" = "hello"
tanaka.say_hello               # =>hello
```

## <i class="fa fa-comment" style="font-size:1em;"></i> どっち？
どっちがお好みですか？

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Module - るりま](http://docs.ruby-lang.org/ja/2.2.0/class/Module.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Object - Crystal Docs](http://crystal-lang.org/api/Object.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Issue651(method naming conventions ) - Crystal - GitHub](https://github.com/manastech/crystal/issues/651)