LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: sfatsdu

Ruby Code Snippet

[复制链接]
 楼主| 发表于 2005-8-8 18:52:43 | 显示全部楼层
关于上面的帖子再多说几句,最令人奇怪的是当你创建了某个类的实例,即

  1. f = Foo.new
复制代码

你可以继续再f上重新定义各种各样的method,上面已经有了例子我就不说了,看的比较清楚的办法是像这样

  1. class << f
  2.     def inst_meth
  3.         xxx
  4.         xxx
  5.     end
  6. end
复制代码

瞧,我们再f 这个实例上又打开了一个类,这里定义的方法可以overide原先class Foo中的行为.Matz称之为singleton class notation.其他的叫法有metaclass或者eigenclass,不一而足
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-11 14:56:44 | 显示全部楼层
看看open-uri模块的威力,相当于curl,和Ruby的IO体系很好的融合在一起
另一个有意思的地方是"00001".upto("00050")
来自
http://redhanded.hobix.com

  1. #!/usr/bin/ruby
  2. require 'open-uri'
  3. BASE_URL = "http://www.rubyist.net/~matz/slides/oscon2005/mgp"
  4. "00001".upto("00059") do |n|
  5.         puts "Fetching #{n}.html... ..."
  6.         File.open(n + ".html", "w") do |f|
  7.                 f.write(open(BASE_URL + n + ".html").read)
  8.         end
  9. end

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-16 16:03:03 | 显示全部楼层
meta-programming...

  1. class Foo
  2.   class << self
  3.     def class_meth; xxx; end
  4.   end
  5.   def inst_meth; xxx; end
  6. end
复制代码

As pointed out before, we use the notation of
class << self; def xxx; end; end
is the same as
def self.xxx; end
but use this notation makes that class methods look more consistant with class instance methods, and improve the readbility of your code
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-19 11:02:48 | 显示全部楼层
I collected some good article from college bbs, save them as html file, they look like this
<html>
<pre>
original post
</pre>
</html>
The following script extract original post from html files, save them as filename.txt
Here I use this ruby library htmltokenizer, ported from Perl
http://rubyforge.org/projects/htmltokenizer/

  1. require 'html/htmltokenizer'
  2. collection = Dir['*.html'] # collect inserested html file names in a array...
  3. collection.each do |t| # do our magic in blocks
  4.         token = HTMLTokenizer.new(IO.read(t))
  5.         token.getTag("pre")
  6.         File.open(File::basename(t, ".html") + ".txt", 'w') do |handle| # nested block
  7.                 handle << token.getText("/pre")
  8.         end
  9. end
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-20 10:31:06 | 显示全部楼层
meta-programming

  1. class Foo
  2.     attr_reader :instance_variable
  3.     class << self
  4.         def initialize(str)
  5.             @instance_variable =  str
  6.         end
  7.     end
  8. end

  9. foo = Foo::new("hehe")
  10. foo.instance_variable # => "hehe"
复制代码

so we call the method access_reader(xxx) in the definition of class, and we get the instance method "xxx", we don't use the normal way of
  1. def instance_variable
  2.   @instance_variable
  3. end
复制代码

you may think this is just a short notation of making methods, of course it is, however, you may extensively use this technique in your programming practice. The first good practice is define your own version of attr, attr_reader, attr_writer, attr_accessor methods. Why? since then, our class instance can interactive with other objects, that will simplify many things.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-22 14:37:19 | 显示全部楼层

  1. module Enumerable
  2.         def paginate(size)
  3.                 i = 0
  4.                 self.inject([]) {|arr, item|
  5.                         (arr[i/size] ||= []) << item
  6.                         i += 1
  7.                         arr
  8.                 }
  9.         end
  10. end
  11. __END__
  12. (1..14).to_a.paginate(4) # => [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14]]
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-22 21:50:45 | 显示全部楼层
想象上面那个例子用在论坛或者组织照片,文档的网络应用上...
这里也反映了Ruby的一个特点:Class都是Open的,完全可以根据程序流程的需要,扩展原有的Class,甚至是针对每个instance作扩展...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-23 15:14:27 | 显示全部楼层
请Python大虾们举几个generator作为iterator的例子,谢谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-10 00:25:59 | 显示全部楼层

  1. def Hash::[]( enum )
  2.         enum.inject({}) do |hsh, (k,v)|
  3.                 hsh[k] = v
  4.                 hsh
  5.         end
  6. end
  7. __END__
  8. keys = %w(a b c) # keys = ['a', 'b', 'c']
  9. values = [1,2,3] # values = [1, 2, 3]
  10. Hash[keys.zip(values)] #  {"a"=>1, "b"=>2, "c"=>3}
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-18 12:59:21 | 显示全部楼层
好久没有看Ruby了,一个新的例子
首先做一个modle,批量定义了 <,=,>三个method,ri define_method可以看到详细说明

  1. module A
  2. ["<", "=",">"].each do |op|
  3.         define_method(op) {|comparision|
  4.                 eval "#{self.order} #{op} #{comparision.order}"}
  5. end
  6. end
复制代码

一个简单的class

  1. class B
  2. attr_accessor :order
  3. def initialize(order)
  4. @order = order
  5. end
  6. end
  7. a = B::new(100)
  8. b = B::new(200)
复制代码

现在呢
a.order # =>100
b.order # =>200
a < b # => NoMethodError
把B的定义改作

  1. class B
  2. include A # 包含进模块A
  3. attr_accessor :order
  4. def initialize(order)
  5. @order = order
  6. end
  7. end
复制代码

好了,对于a,b这两个类B的实例,用instance variable order来进行比较
a > b # => false
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表