warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
def ExampleDate.once(*ids)
for id in ids
module_eval <<-"end_eval"
alias_method :__#{id.to_i}__, #{id.inspect}
def #{id.id2name}(*args, &block)
def self.#{id.id2name}(*args, &block)
@__#{id.to_i}__
end
@__#{id.to_i}__ = __#{id.to_i}__(*args, &block)
end
end_eval
end
end
class ExampleDate
def hi
puts'orginal method was call''hello'endend# รับ parameter เป็นชื่อ method ที่จะทำ Memoize # Memoize เคยมีพูดกันในโจทย์สามเหลี่ยม pascal http://www.codenone.com/node/155)def ExampleDate.once(*ids)for id in ids
# evaluate string ข้างล่างนี้เพื่อเพิ่ม method ลงไปใน class
module_eval <<-"end_eval"# step1 สร้าง method alias ชื่อ __xxxx__ ที่ชี้ไปที่ method ตัวดั้งเดิม
alias_method :__#{id.to_i}__, #{id.inspect}# step 2 สร้าง method ทับลงไปบน method เดิม เพื่อเปลี่ยนพฤติกรรมdef#{id.id2name}(*args, &block)# step 3, method ตัวที่พึ่งสร้างใน step ที่ 2 ก็จะถูกทับใหม่ ด้วยตัวนี้แทนdefself.#{id.id2name}(*args, &block)puts'method from step 3 was called'# return ค่าที่ momoize ไว้@__#{id.to_i}__endputs'method from step2 was called'# เก็บค่าที่ได้จากการ call ไปยัง method ตัวดั้งเดิม ไว้ใน instance variable@__#{id.to_i}__ = __#{id.to_i}__(*args, &block)end
end_eval
endend
เวลา run ก็จะเป็นแบบนี้
irb(main):056:0> ExampleDate.once(:hi)[:hi]
irb(mai):057:0> x = ExampleDate.new#<ExampleDate:0xb7ccd438>
irb(main):058:0> x.hi
method from step2 was called
orginal method was call
"hello"
irb(main):059:0> x.hi
method from step 3 was called
"hello"
ตอบตรงๆ Ruby on Rails เจ๋งกว่าในทุกด้าน ข้อเสียอย่างเดียวของ Ruby on Rails ก็คือมันเป็น Ruby
Ruby ดีทุกอย่าง เสียอย่างเดียว มันดีเกินไป ผมชื่นชม Ruby นะ มันดีจริงๆ แต่ทำใจเขียนไม่ได้ซักครั้ง
เห็นด้วยกับ sugree ขอใส่ของตัวเองเล็กน้อย
เท่าที่เล่นมา RoR > Turbo Gears > Django ครับ
Django อันนี้เป็น build in framework มีครบวิธีเขียนเข้าใจง่ายมากหมัดเด็ดคือ Admin Page แต่เวลาติดตั้งปวดหัวเล็กน้อย + เอกสารอาจอ่านยากนิดๆห้ามข้ามสำคัญทุกบรรทัด
Turbo Gear ง่ายเลย ง่ายมากๆมีหนังสือด้วย อันนี้มาแนว integrated framework เอาของคนอื่นมาผสมโรง ทำให้ได้ความหวือหวา เข้าใกล้ RoR
RoR สุดยอดชนะทุกประตู
---------------------------------แต่
def self.#{id.id2name}(*args, &block)
@__#{id.to_i}__
end
--------------------------------- ผมจอดตั้งแ่บรรทัดแรก
เดี๋ยวแฟน(ที่ไม่ชอบ) perl จะตกใจ code ของ roof
code ข้างบน ไม่ได้ใช้ special syntax แบบ perl เลยนะ
ตรง @__#{id.to_i}__ , จะใช้ชื่อที่อ่านง่ายๆก็ได้ เช่น @internal_#{id_to_i}
อุ่ยขอบคุณครับพี่
ขอดูแบบสวยๆ หน่อยครับ สารภาพตามตรง ผมไม่เข้าใจซักนิด
ตรงที่ roof เขายกมา จริงๆมันเป็น String template น่ะครับ
ลองดูตัวอย่าง code นี้
Note: code ของ roof ยากกว่าตัวอย่างที่ผมยกมา
ตรง scope ของมันเป็นระดับ class (class method + instance variable ของ class )
อันนี้ต้นฉบับครับเอามาจาก http://www.ruby-doc.org/docs/ProgrammingRuby/ ขออภัยที่ไม่ได้บอกที่มาครับทุกท่าน
ผมผิดเอง ก่อนหน้านี้จะมีลำดับการเขียนมาเป็นระยะว่าเขียนมาได้กี่แบบครับ อันนี้เป็น code ของ Tadayoshi Funaba ครับ
def ExampleDate.once(*ids) for id in ids module_eval <<-"end_eval" alias_method :__#{id.to_i}__, #{id.inspect} def #{id.id2name}(*args, &block) def self.#{id.id2name}(*args, &block) @__#{id.to_i}__ end @__#{id.to_i}__ = __#{id.to_i}__(*args, &block) end end_eval end endอภัยมา ณ ที่นี้ ที่บอกตกม้าตายคือผมความรู้ไม่ถึงครับเป็นข้อผิดพลาดส่วนตัว
แบบนี้ถือว่าซับซ้อนหรือยังครับ สารภาพอีกรอบ เห็นแล้วรู้สึกเหมือนตอนแอลกอฮอล์ฉีดไปตามเส้นเลือด def ใน def ใน eval
ซับซ้อนครับ เห็นแล้วปวดหัว
ไปแกะมาแล้วครับ
ลองอ่าน comment ดูว่ามันทำอะไรบ้าง
เวลา run ก็จะเป็นแบบนี้
เคยสอบตกเพราะเจอ Perl
ความหลังฝังใจ พอบอกว่า Ruby มัน derive มาจาก Perl ผมก็เลิกอ่าน
ถ้าเอาลิงมาล้านตัว มานั่งคอมพิวเตอร์ตัวละเครื่อง จะมีลิง หนึ่งตัว ที่ "อ่าน" code Ruby รู้เรื่อง แต่ลิงทุกตัว "อ่าน" Code java ได้หมด อันนี้เป็นปรัชญา แซวกันเล่นๆ ขำๆครับ
แบบนั้นลิงทุกตัวอาจจะ "เขียน" Code Python ได้ นะครับ :-) (ขำๆ เช่นกัน)
วลีลิง นี้คุ้นๆนะ