Rubyでメソッドを1行に定義するにはどうすればよいですか?


92

def greet; puts "hello"; endRubyでメソッドを1行で定義する唯一の方法は何ですか?


11
答えからわかるように、メソッドを1行でさまざまな方法で定義することは可能ですが、問題は、あなたがそうするべきですか?メンテナンスや読みやすさの理由から、定義は明確でクリーンな方法で記述する必要があります。そのため、1行が扱いにくくなったり混乱したりする場合は、広げてください。一部の言語ではコードスタッドの方法として簡潔なコーディングが推奨されていますが、Rubyコーディングスタイルでは、スタッドよりも優雅さ、読みやすさ、保守性が向上します。最初の3つを達成すればお辞儀します。
Tin Man

回答:


102

括弧を使用すると、セミコロンを使用する必要がなくなります。

def hello() :hello end

1
これはセミコロンを使用するよりも長い...?
Apollysは2017

73

完全に新鮮な答えを与えるだけです:

一般に、単一行のメソッドは避けてください。それらは実際にはやや人気がありますが、それらの使用を望ましくないものにする定義構文に関するいくつかの特殊性があります。いずれにせよ、単一行メソッドには式が1つだけ存在する必要が あります

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

ルールの1つの例外は、空のボディメソッドです。

# good
def no_op; end

bbatsov /ルビ風ガイド


39
def add a,b; a+b end

セミコロンはRubyのインラインステートメントターミネーターです

または、define_methodメソッドを使用できます。(編集:これはruby 1.9では非推奨です)

define_method(:add) {|a,b| a+b }

4
Ruby 2+では非推奨になっていないようです
michau

9

別の方法:

define_method(:greet) { puts 'hello' }

メソッドの定義中にメソッドの新しいスコープを入力したくない場合に使用できます。


NoMethodError:Ruby 1.9.3のObject:Classで呼び出されるプライベートメソッド `define_method '
Jared

3
define_methodRuby 1.9で「私有化」されました
edgerunner

8

さらに別の方法:

def greet() return 'Hello' end

12
Rubyでは、メソッドの戻り値は最後のステートメントによって返された値です。returnここはガード句ではないので、ここは必要ありません。
ダミアン

1
必須ではありませんreturnRubyに精通していない(またはRubyに精通している)人々にとって読みやすさが向上する可能性があるため、賛成です。YMMVの1つです...
Potherca
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.