参数传递的问题

参数传递的问题

Tags = {
  :start_code    => [ /\[code\]/i,         '<pre>' ],
  :end_code     => [ /\[\/code\]/i,         '</pre>' ],
  :image      => [ /\[img\](.+?)\[\/img\]/i,     '<img src="\1" />' ],
  :size      => [ /\[size=(\d{1,2})\](.+?)\[\/size\]/i, '<span style="font-size: \1px">\2</span>' ],
  :color      => [ /\[color=([^;]+?)\](.+?)\[\/color\]/i, '<span style="color: \1">\2</span>' ]
  }

#上面Tags里的hash删掉了一大半,不完整。为了让大家看得没这么吃力.

  TagList = [ :bold, :italic, :underline, :email_with_name, :email_sans_name,
      :url_with_title, :url_sans_title, :image, :size, :color,
      :code, :quote ]

  def bbcodeize(text)
  text = text.dup
  TagList.each do |tag|
   if Tags.has_key?(tag)
    apply_tag(text, tag)
   else
    self.send(tag, text)
   end
  end
  text
  end

 
 private



  def apply_tags(string, *tags)
上面 apply_tag(text, tag) 这个tag 只是一个键是吧?为什么这里要 *tags呢?
  tags.each do |tag|
   while_true { string.sub!(*Tags[tag]) }

//平时用sub!方法不都是成对出现么?例如 "hello".sub!(/e/, '*')   ---   "h*llo"
//这里怎么只给出一个参数呢?
  end
  end
  alias_method :apply_tag, :apply_tags

def while_true(&block)
  { } while yield
  end

这个while_true方法又怎么理解?

apply_tags(string, *tags)
接受多个参数或数组
"hello".sub!(/e/, '*')   ---   "h*llo"
老大,这不是成对出现,书上写这个方法的时候,顺便写了他的运行结果。。。-_-!!!
while_true自定义方法,是一个proc
apply_tags(string, *tags)
接受多个参数或数组
==
TagList.each do |tag|
   if Tags.has_key?(tag)
    apply_tag(text, tag)

前面的传递的不是每次只有一个参数么?


"hello".sub!(/e/, '*')   ---   "h*llo"
老大,这不是成对出现,书上写这个方法的时候,顺便写了他的运行结果。。。-_-!!!
我的意思是 sub!(/e/ ,'*') 里面的
/e/, '*')
这里意思是将e替换为 *
=====


 while_true { string.sub!(*Tags[tag]) }
而这里的 string.sub!(*Tags[tag]}
*Tags[tag] 这里只能一个参数,那么替换为什么呢?


我现在想是这样 *Tags[tag]是一个键, 这样就会执行其值 所以执行了后面的 [] 替执其中的内容.

我还是不明白为什么 Tags[tag] 前要加 *
这个 *是什么意思呢?
哈哈,我又看错了,不好意思
gsub!方法你可以去看看PR,有两种形式,第一个就是你说的那key-velue的形式,第二种是:
str.gsub!(pattern){|match| block}
那个参数前加*表示参数的数目是可变的
你为什么不先翻翻书呢?

[ 本帖最后由 blackanger 于 2007-8-28 10:44 编辑 ]
*如果放在参数列表里代表这个参数会将后面的参数作为一个数组传入。

如果放在一个数组前面,代表会将这个数组分解,作为单独的参数传入,PR书的后面部分要好好看,那里才是精华。