บางที ruby กับ python ก็ดูจะเหมือนพี่น้องที่คลานตามกันมา
ลองดูที่ lew post ไว้ใน แนะนำโมดูลที่น่าสน (Standard Module)
ลองเขียนเป็น ruby บ้าง
require 'stringio'
f = StringIO.new("ascdef")
f.read(2) # => "as"
f.tell # => 2
f.seek(0)
f.read # => "ascdef"
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
สงสัยอีกแล้ว มันจะรู้ได้ยังไงว่า
f.tellนี้หมายถึง ตัวฟังก์ชั่นเอง หรือว่าให้เรียกฟังก์ชั่นนั้นอย่าง Python นี่ชัดเจน ถ้าต้องการเรียกก็ต้องมี
()ถ้าไม่มีก็เป็นแค่ pointerในหนังสือ programming ruby เค้าบอกว่า
no other object can access an object’s instance variables.
ดังนั้น f.tell จึงเป็นการ call function เท่านั้นครับ ไม่ใช่ pointer
ถ้าต้องการให้มันเสมือนเรียกได้แบบ f.tell ก็เขียนแบบนี้ครับ
หรือไม่ก็ทำง่ายๆ แบบนี้
ถ้าต้องการให้มันเขียนได้ด้วย ก็ลองแบบนี้ครับ
เวลากำหนดตัวแปลมันจะเป็น private โดยอัตโนมัติครับ ต้องมาทำกระบวนการข้างต้นเพื่อให้มันดูเหมือนตัวแปล public
Apirak
ปล. code ผมลอกมาจากหนังสือแต่พยายามแก้ให้เห็น f.tell จะได้อ่านง่ายหน่อย
งั้นแปลว่าส่ง method ไปให้ฟังก์ชั่นอื่นไม่ได้ใช่มั๊ยครับ ต้องใช้
{}ครอบแทน นี่ผมเริ่มจะเข้าใจมันรึยังเนี่ยประมาณว่าจาก python แบบข้างล่างจะเปลี่ยนเป็น ruby ยังไงเปล่าครับ?
ผมก็นึกออกแต่ท่าที่ใช้ {} กะ Proc หละครับ
มีท่าอื่นอีกเปล่าครับ?
yieldได้รึป่ะyeild เขียนง่ายๆ ประมาณนี้ครับ
output จะออกมาประมาณนี้ครับ
Start of method
In the block
In the block
End of method
Apirak
ถ้าเขียนด้วย java ก็จะเป็นแบบนี้ครับ
Apirak
syntax ของ ruby
สามารถเรียกใช้ method โดยไม่ต้องใส่วงเล็บได้ครับ
การ implement ก้คงต่างกันครับ
อย่าง code ข้างบน เราประกาศ say ไว้โดยไม่มี class ครอบ
คำถามก็คือ say นั้นอยู่ใน scope ของใคร
ใน ruby, say เป็น method ที่อยู่ภายใต้ top level object
ลอง run
ruby -e "puts self"จะเห็นว่ามัน top level object มีชื่อว่า main
อืม main นี่เหมือน python หน่อย เรื่อง scope พอจะเข้าใจแล้ว