NeuronCheckは、Ruby 2.1以降で正式導入された「Refinement」機能を使うことで、より短く、言語と統合されたかのような書き方を使うことができるようになっています。
この機能をNeuronCheckSyntaxと呼びます。
たとえば、NeuronCheckSyntaxを使わないとき、引数と戻り値のチェック宣言は下記のようになりますが……
require 'neuroncheck'
class Converter
extend NeuronCheck
ndecl {
args String, respondable(:each), [Numeric, nil]
returns String
}
def convert(text, keywords, threshold = nil)
# (メイン処理)
end
end
class Token
extend NeuronCheck
ndecl { args String }
def initialize(name)
# (メイン処理)
end
end
Ruby2.1以降で、using NeuronCheckSyntax
を実行すると、下記のような書き方に変えることができます。
require 'neuroncheck'
using NeuronCheckSyntax
class Converter
decl String, respondable(:each), [Numeric, nil] => String
def convert(text, keywords, threshold = nil)
# (メイン処理)
end
end
class Token
decl String
def initialize(name)
# (メイン処理)
end
end
using NeuronCheckSyntax
をファイルの頭で実行することで、そのファイル内でのみ下記のような効果が発生します。
-
各クラスごと/モジュールごとのextendが不要になります。 これは多数のクラスやモジュールを宣言したいときに便利です。
-
Rubypeライクな
ndecl
の短縮記法が使えるようになります。 通常はブロックの中でargs, returnsを宣言する必要がありますが、上記のコードではブロックを使わず、また引数と戻り値の両方を同時に宣言しています。もちろん、anyやrespondableなどの宣言用キーワードも使用可能です。 -
細かい点ですが、
ndecl
のエイリアスとしてdecl
が使えるようになります。同様にdeclare
,sig
もエイリアスとして使用可能になります。
typesig
とcheck
はエイリアスとして使用できません。typesig
はRubypeと衝突するためで、check
は一般的な動詞であり、かつメソッド名としての使用頻度が高いためです。
短縮記法における制限
ndecl
の短縮記法には記法上の制限があり、引数が1つもないときに、下記のように記述することはできません。
class Token
decl => String
def inspect
# (メイン処理)
end
end
#=> SyntaxErrorが発生する
代わりに、下記のような記述を行ってください。
class Token
decl [] => String
def inspect
# (メイン処理)
end
end
# 正常に動作
(NeuronCheckは上記の記述に対して特殊な解釈を行い、「引数0個のメソッドである」ものとして扱います)