rubyシンプルベース5

3229 ワード

メソッドとコードブロック
ルビーでは、{}またはdo...end間のコードはコードブロックです.
コードブロックは、メソッドの最後のパラメータの同じ行にのみ表示され、一般的にyieldキーワードによってコードブロック内のコードが呼び出されます.
方法は有名なコードブロックであり、1つ以上のオブジェクトに関連付けられたパラメトリックコードである.
メソッドを呼び出すときは、メソッド名、オブジェクト(受信者)、およびメソッドの最後の式の値がメソッド呼び出しの戻り値として使用されるゼロまたは複数のパラメータ値を指定する必要があります.
コードブロックはrubyが操作できるオブジェクトではありません.一般的に、Procオブジェクトでコードブロックを表します.
Procオブジェクトには、procとlambdaの2つの方法があります.いずれも閉パッケージです.定義時に存在する範囲内のローカル変数を維持し、外部範囲が呼び出された場合でもアクセスできます.
方法の定義は言わないで、前に言ったことがあります.
メソッド名は小文字で始まり、メソッド名が1文字を超える場合は下線で分割されます.
メソッドオプションのカッコは、puts「hello」とputs(「hello」)が同じように、多くのメソッド呼び出しで省略できます.
rubyは強いオブジェクト向けの言語で、彼のオブジェクトは完全にカプセル化されて、彼らと交流する唯一の方法は彼らの方法を呼び出すので、len=“hello”.lengthは実はlen=「hello」です.length()は、カッコを省略しただけで、彼の属性アクセスのように見えます.
一般に、パラメータが1つを超える場合は、カッコは省略しないほうがいいです.
コードブロックパラメータの従来の方法は、コードブロックがメソッドの後ろに直接付いてyieldでコードブロックを呼び出すことである.
関数にはyield文があり、実行時に関数外のblockを実行できます.そしてこのblockは自分のcontextを持っていて、callbackに似ている感じがして、cの中のマクロ定義に似ています.
yieldはプレースホルダの役割を果たし、関数はまずプレースホルダを与え、この関数は純粋な必要関数のように直接呼び出すことができず、blockでこのビットピットを追加しなければこの関数を使用できないと言われています. 
def block_test(num)
	if block_given?
		#yield #   
		yield (num)
	else
		puts num
	end


end


#block_test(1)
#block_test(2) { puts "this is a block ..."}
block_test(2) {|x| puts x * 2}

あるいは、メソッドの後ろにパラメータを付けて&をこのパラメータの接頭辞として使用すると、このパラメータはメソッドに渡されるコードブロックを指し、このパラメータの値はProcオブジェクトであり、yieldによって呼び出されるのではなく、callによって呼び出されます.
def proc_test(num,&b)


	if block_given?
	 	#b.call
		b.call(num * 3)
	else
		puts "no block"
	end


end


#proc_test(1) 
#proc_test(1) {puts "this is a block"}
proc_test(1) {|x| puts x * 2}

Procオブジェクトを作成する3つの方法Proc.new
メソッドの最後のパラメータの前に"&"記号を追加すると、RubyはこのパラメータをProcオブジェクトとして処理します.
すべてのProcオブジェクトにはcallメソッドがあり、このメソッドを呼び出すと、このProcオブジェクトを作成するときに定義されたコードブロックが実行されます.
Proc.newはパラメータを持たず、proc方式のProcオブジェクトを返します.Procオブジェクトにはproc方式,lambda方式がある.
Proc.newはパラメータを持ち、この関連するコードブロックを表す関連コードブロックのProcオブジェクトを返します.
p = Proc.new { puts "hello,dear..."}


def proc_test(&pp)
	pp.call
end

Kernel.lambda
Lambdaメソッドは、lambda方式のProcオブジェクトを返します.
Lambdaメソッドにはパラメータはありませんが、呼び出し時にコードブロックを関連付ける必要があります.
puts lambda{|x| x + 10}.call(2)

Kernel.proc
この1.8はlambdaの同義語で、1.9はProcです.newの同義語.
これは言わない.
コードブロック、proc、lambdaのreturn
1つのコードブロックのreturn文は、コードブロックを呼び出す反復器だけでなく、反復器を呼び出す方法からも返されます.
def test
	puts "start.."
	2.times {puts "hello,";return}
	puts "end..." #     
end

Procはコードブロックと似ているので、呼び出されたprocでreturn文を実行すると、コードブロックが存在するメソッドから戻ろうとします.
一方、lambdaのreturn文は、lambda自体からのみ返されます.
def pro_fun (msg)
	puts "start..."


	p = Proc.new {puts "hello,#{msg}";return} #          pro_fun   
	p.call


	puts "end..."
end


def lambda_fun(msg)
	puts "start.."
	lam = lambda {puts "hello,#{msg}";return} #      
	lam.call
	puts "end..."
end


def test
	puts "test start"
	#pro_fun "song"
	lambda_fun "song"
	puts "test end"
end


test