ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>99香蕉久久,国产一区二区三区四区五区3d,精品小视频在线http://www.aygfsteel.com/byterat/category/16519.htmlzh-cnFri, 02 Mar 2007 02:34:18 GMTFri, 02 Mar 2007 02:34:18 GMT60RubyGems½Ž€ä»‹å’Œä½¿ç”¨http://www.aygfsteel.com/byterat/archive/2006/12/15/87867.html比特é¼?/dc:creator>比特é¼?/author>Fri, 15 Dec 2006 01:53:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/12/15/87867.htmlhttp://www.aygfsteel.com/byterat/comments/87867.htmlhttp://www.aygfsteel.com/byterat/archive/2006/12/15/87867.html#Feedback0http://www.aygfsteel.com/byterat/comments/commentRss/87867.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/87867.html

特点åQ?br />能远½E‹å®‰è£…包
包之间依赖关¾pÈš„½Ž¡ç†
½Ž€å•可靠的卸蝲åQˆuninstallationåQ?br />查询机制åQŒèƒ½æŸ¥è¯¢æœ¬åœ°å’Œè¿œ½E‹æœåŠ¡å™¨çš„åŒ…ä¿¡æ¯
能保持一个包的不同版æœ?br />åŸÞZºŽWeb的查看接口,能查看你安装的gem的信息ã€?br />

使用åQ?br />1. gem query --remote        # shortcut: gem q -R
#列出所有包
2. gem query --remote --name-matches doom   # shortcut: gem q -R -n doom
#列出所有名字匹配的�br />3. gem install --remote progressbar  # shortcut: gem i -r progressbar
#安装指定名字的包ã€?br />gem ins -r progressbar --version '> 0.0.1' #˜q™é‡Œå¯ä»¥åŒšw…ç‰ˆæœ¬
4. gem specification  progressbar  # shortcut: gem spec progressbar
#查看安装˜q‡çš„æŒ‡å®šåŒ…详¾l†ä¿¡æ?br />5.gem uninstall progressbar
#卸蝲�br />6. gem query --local # shortcut: 'gem q -L'
#列出所有本地安装过的包
7. gem ins rake
#在本地安装,如果没有˜qœç¨‹å®‰è£…
8. gem list -b ^C
#列出所有以C开头的�br />9. gem_server
开启rdoc服务。可以查看安装包的rdoc



]]>
ActiveRecord知识http://www.aygfsteel.com/byterat/archive/2006/12/15/87857.html比特é¼?/dc:creator>比特é¼?/author>Fri, 15 Dec 2006 01:30:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/12/15/87857.htmlhttp://www.aygfsteel.com/byterat/comments/87857.htmlhttp://www.aygfsteel.com/byterat/archive/2006/12/15/87857.html#Feedback0http://www.aygfsteel.com/byterat/comments/commentRss/87857.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/87857.html Tip 1. 默认情况下,Railsè®¤äØ“¾cÕdæ˜¯å•敎ͼŒè¡¨æ˜Žæ˜¯å¤æ•°åŞ式ã€?br />如果你不喜欢˜q™æ ·çš„行为可以在配置文äšg(config/environment.rb)中设¾|®ä¸€ä¸ªå…¨å±€æ ‡è¯†æ¥ç¦ç”¨å®ƒã€?br />ActiveRecord::Base.pluralize_table_names = false

Tip 2.默认情况下,ActiveRecord会ä‹Éç”¨æŽ¨å¯ÆD¡¨æ˜Žçš„½Ž—法åQŒå¦‚果你不希望ä‹É用此½Ž—法可以在指定的model中ä‹Éç”?"set_table_name" æ–ÒŽ³•åQŒä¾‹å¦‚:
class Sheep < ActiveRecord::Base
 set_table_name "sheep"
end

Tip 3.SQL ¾cÕdž‹å’ŒRuby ¾cÕdž‹ä¹‹é—´çš„对应关¾pÕd¯èƒ½ä¼šåœ?decimal ¾cÕdž‹çš„精度上出现问题。SQLçš?demimal,numeric,float,double 都对åº?Ruby çš?Float。可以ä‹É用聚合对è±?composed_of 对字ŒDµè¿›è¡Œå¤„理。                                                                                                                                                                                        Â?

Tip 4.ActiveRecordä¼šå°½é‡çš„æŠŠä»Žæ•°æ®åº“ä¸­èŽ·å–çš„å€ÆD{æ¢äØ“Ruby的类型(譬如è¯ß_¼Œå‡è®¾æ•°æ®åº“å­—ŒD‰|˜¯ timestamp ¾cÕdž‹çš„,ž®×ƒ¼š˜q”回 Time 对象åQ‰ã€‚如果你希望得到一个属性的原始å€û|¼Œå¯ä»¥åœ¨å±žæ€§å¿U°åŽé¢åŠ ä¸?_before_type_cast.

Tip 5.Ruby è®¤äØ“åQšé™¤äº?nil å’?false ä¹‹å¤–çš„æ‰€æœ‰å€¼éƒ½è¢«è§£é‡ŠäØ“ true。所以,如果要查询一ä¸?boolean 型字ŒD늚„状态,ž®±å¿…™åÕdœ¨å­—æ®µåçš„åŽé¢åŠ ä¸Šä¸€ä¸ªé—®åøP¼š
user = User.find_by_name("Dave")
if user.superuser? # 不可以ä‹Éç”?user.superuseråQŒå¦åˆ™ä¸è®ºæ•°æ®åº“中存储的是数å­?0、字½W¦ä¸² f ˜q˜æ˜¯å¾¯‚¯­çš?NåQŒæ­¤æ¡äšg都将成立ã€?br /> grant_privileges
end



]]>
Ruby 基础学习http://www.aygfsteel.com/byterat/archive/2006/11/22/82209.html比特é¼?/dc:creator>比特é¼?/author>Wed, 22 Nov 2006 03:26:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/11/22/82209.htmlhttp://www.aygfsteel.com/byterat/comments/82209.htmlhttp://www.aygfsteel.com/byterat/archive/2006/11/22/82209.html#Feedback0http://www.aygfsteel.com/byterat/comments/commentRss/82209.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/82209.html 最˜q‘一直在看Programming Ruby - 2nd, 先记录下一些不熟悉的Ruby的基本语法和操作(熟悉的就不再记啦...)

Ruby的命�

      局部变量         全局变量      实例变量      ¾cÕd˜é‡Â Â Â?         帔R‡å’Œç±»å?br />==============================================================================
      name            $debug       @name        @@total           PI
      fish_and_chips  $CUSTOMER    @point_1     @@symtab          FeetPerMile
      x_axis          $_           @X           @@N               String      
      thx1138         $plan9       @_           @@x_pos           MyClass
      _26             $Global      @plan9       @@SINGLE          JazzSong
==============================================================================


数组:

数组下标ä»?å¼€å§? ä¸‹æ ‡å¯ä»¥ä¸ø™´Ÿæ•´æ•°, 此时代表数组从最末端开å§? 最末端索引ä»?1å¼€å§?br />数组的元素可以是ä»ÖM½•¾cÕdž‹çš„对象实ä¾?包括nil实例

数组的初始化:
a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
或�br />a = %w{ ant bee cat dog elk }

讉K—®:
a[0]    #˜q”回"ant"
a[1]    #˜q”回"bee" 
a[-1]   #˜q”回"elk"
a[-2]   #˜q”回"dog"

赋�
a = [ 1, 3, 5, 7, 9 ]
a[1] = 'bat'       #a = [1, "bat", 5, 7, 9]
a[3]= 'cat'        #a = [1, "bat", "cat", 7, 9]
a[3] = [ 9, 8 ]    #a = [1, "bat", "cat", [9, 8], 9]
a[6] = 99          #a = [1, "bat", "cat", [9, 8], 9, nil, 99]

a = [ 1, 3, 5, 7, 9 ]
a[2, 2] = 'cat'           #a = [1, 3, "cat", 9]
a[2, 0] = 'dog'           #a = [1, 3, "dog", "cat", 9]
a[1, 1] = [ 9, 8, 7 ]     #a = [1, 9, 8, 7, "dog", "cat", 9]
a[0..3] = [ ]             #a = ["dog", "cat", 9]
a[5..6] = 99, 98          #a = ["dog", "cat", 9, nil, nil, 99, 98]


哈希�
相当于Java中的Map
å…ähœ‰"键值对"ç‰ÒŽ€? keyå’Œvalue都可以是ä»ÖM½•¾cÕdž‹çš„实ä¾?br />
哈希的初始化:
h = Hash["a", 100, "b", 200]     # {"a"=>100, "b"=>200}
h = Hash["a" => 100, "b" => 200] # {"a"=>100, "b"=>200}
h = { "a" => 100, "b" => 200 }   # {"a"=>100, "b"=>200}

讉K—®:
h.length = 2

赋�
h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
h.length    # 3
h['dog']    # "canine"
h['cow']    # 'bovine'
h[12]       # 'dodecine'
h['cat'] = 99
h           # {"cow"=>"bovine", "cat"=>99, 12=>"dodecine","donkey"=>"asinine", "dog"=>"canine"}


代码�
代码块在ruby 中是以{} å’Œdo end 来包围è“v来的。通常如果是单行ä‹É用{} åQŒå¦‚果是多行使用do..end
代码块可以接受参æ•? 参数用两个竖¾U?|"½W¦å·æ¥åŒ…å? 参数间用逗号","来分éš?br />ä»£ç å—è¢«ä½œäØ“ä¸€ä¸ªå¯¹è±¡ä¼ å…¥method体中执行(如果代码块对象有参数, 则method体在执行代码块中的代码前,需要对代码块对象的参数赋å€?

例如:

def test(max)
   i1, i2 = 1, 1          # parallel assignment (i1 = 1 and i2 = 1)
   while i1 <= max
      yield i1            # 也可以写成yield(i1), yield指ä×o代表了代码块执行的位¾|? i1是method体中对代码块f˜q›è¡Œäº†èµ‹å€?br />      i1, i2 = i2, i1+i2
   end
end

test(1000) {|f| print f, " " }

输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987



又例�
[1,3,5,7].inject(0) {|sum, element| sum+element} # 输出:16



Method的声�

一般格式是:
   def my_new_method(arg1, arg2, arg3)    # 3 arguments
      # Code for the method would go here
   end

æ–ÒŽ³•名initialize是特ŒDŠçš„method, 它在¾cȝš„new操作时被执行, 用于对类实例˜q›è¡Œåˆå§‹åŒ–操ä½?
   def initialize(name, &block)
      @name, @block = name, block
   end

如果需要方法返回一个å€? 可以昑ּä½¿ç”¨return关键å­? 也可以ä‹Éç”?默认最后一行返回å€?形式:
   def meth_one
      "one"    # 相当�return "one"
   end

如果method的声明中最后的参数带有"&"前缀(例如下例çš?amp;action), 则表½Cø™¯¥å‚数接受的是代码å? òq¶ä¸”该代码块ž®†è¢«è½¬æ¢ä¸ºProc对象, 最后被赋值给一个类实例变量,å¦?
   class JukeboxButton < Button
      def initialize(label, &action)
         super(label)
         @action = action #代码块对象被赋值给一个类实例变量(即@action)
      end
      def button_pressed
         @action.call(self)
      end
   end
   start_button = JukeboxButton.new("Start") { songlist.start }

如果method的声明中最后的参数带有"*"前缀, 表示该参数接受的�个或多个参数(�可变长参�, 例如:
   def varargs(arg1, *rest)
      "Got #{arg1} and #{rest.join(', ')}"
   end
   varargs("one")                # "Got one and "
   varargs("one", "two")         # "Got one and two"
   varargs "one", "two", "three" # "Got one and two, three"

如果methodçš„æ–¹æ³•åæœ€åŽäØ“å­—ç¬¦"=", 表示该方法可为类实例变量赋å€? 相当于Java中的setXXXXæ–ÒŽ³•
   class Song
      def duration=(new_duration)   # 整个æ–ÒŽ³•åäØ“"duration="
         @duration = new_duration   # @duration为类实例变量
      end
   end
   song = Song.new("Bicylops", "Fleck", 260)
   song.duration       # 260
   song.duration = 257 # set attribute with updated value
   song.duration       # 257


   上例中的"duration="æ–ÒŽ³• 相当于下面的: attr_writer :duration
   class Song
      attr_writer :duration
   end
   song = Song.new("Bicylops", "Fleck", 260)
   song.duration = 257


区间:

两个点创å»ÞZ¸€ä¸?包含"区间
1..10    #包含1�0
'a'..'z'

三个点创å»ÞZ¸€ä¸ªé™¤æœ€åŽä¸€ä¸ªå…ƒç´ å¤–的区é—?br />my_array = [ 1, 2, 3 ]
0...my_array.length  # 相当�..2

区间可以通过to_a函数来è{æ¢äØ“æ•°ç»„
a = (1..3).to_a   # a = [1, 2, 3]


区间的一些方�
digits = 0..9
digits.include?(5)                   # true
digits === 5                         # true
digits.min                           # 0
digits.max                           # 9
digits.reject {|i| i < 5 }           # [5, 6, 7, 8, 9]
digits.each {|digit| dial(digit)}    #  0..9


待箋...




]]>
Rubyä¸? ¿Ué€šè¿‡å­—符串类名来产生¾cÕd®žä¾?/title><link>http://www.aygfsteel.com/byterat/archive/2006/10/24/76940.html</link><dc:creator>比特é¼?/dc:creator><author>比特é¼?/author><pubDate>Tue, 24 Oct 2006 04:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/byterat/archive/2006/10/24/76940.html</guid><wfw:comment>http://www.aygfsteel.com/byterat/comments/76940.html</wfw:comment><comments>http://www.aygfsteel.com/byterat/archive/2006/10/24/76940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/byterat/comments/commentRss/76940.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/byterat/services/trackbacks/76940.html</trackback:ping><description><![CDATA[ <font face="Courier New" size="2"> <strong> <font style="BACKGROUND-COLOR: #ffffff" color="#000080">1. 标准用法</font> </strong> <br /> </font> <span id="wmqeeuq" class="postbody"> <font face="Courier New" size="2">c = Object.const_get("Array") <br />s = c.new <br /><br /><strong><font color="#000080">2. 使用Ruby Extension</font></strong><br />c = Class.by_name("Array") <br />参见: <a >http://extensions.rubyforge.org/rdoc/index.html</a><br /><br /><strong><font color="#000080">3. 通过eval</font></strong> <br />c = eval("Array").new</font> </span> <img src ="http://www.aygfsteel.com/byterat/aggbug/76940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/byterat/" target="_blank">比特é¼?/a> 2006-10-24 12:35 <a href="http://www.aygfsteel.com/byterat/archive/2006/10/24/76940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby on Rails的国际化åQŒæœ¬åœ°åŒ–问题的解å†?转蝲)http://www.aygfsteel.com/byterat/archive/2006/10/24/76888.html比特é¼?/dc:creator>比特é¼?/author>Tue, 24 Oct 2006 01:53:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/10/24/76888.htmlhttp://www.aygfsteel.com/byterat/comments/76888.htmlhttp://www.aygfsteel.com/byterat/archive/2006/10/24/76888.html#Feedback1http://www.aygfsteel.com/byterat/comments/commentRss/76888.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/76888.html åŽŸæ–‡å‡ø™‡ª: http://my.donews.com/woodstudio/

Ruby on Rails是一个很不错的web开发框æžÓž¼Œä¸è¿‡ç”׃ºŽç›®å‰å…¶æœ¬íw«å¯¹å›½é™…化的支持较差åQŒæ‰€ä»¥éœ€è¦ä¸€äº›è¾…助的东西来解军_›½é™…化问题ã€?/font>

我最先ä‹É用的是一个叫localization的插ä»Óž¼Œ˜q™ä¸ªæ’äšgçš„ä‹É用说明在Ruby on Rails官方的wiki上面有,˜q™ä¸ªæ’äšg使用比较½Ž€å•,不过功能比较弱ã€?/font>

目前使用的是Ruby-GetTextåQŒè¿™ä¸ªæ’件功能强大,åŸÞZºŽGNUçš„gettextåQŒè¯¦¾l†çš„使用说明åœ?/font> http://manuals.rubyonrails.com/read/chapter/105 上面有写åQŒæˆ‘大概提一下要点:

首先要是Ruby on Rails支持UTF-8åQŒé€šè¿‡ž®†å¦‚下代码添加到environment.rb中:

$KCODE = ‘u�br />require ‘jcode�/font>

接着是安装Ruby-GetTextåQŒè¿è¡Œgem install gettextž®±å¯ä»¥äº†åQŒå¦‚果是Windowsòq›_°ž®±é€?åQŒå¦åˆ™é€?。接着ž®±æ˜¯åœ¨é¡¹ç›®æ ¹ç›®å½•下面创徏po目录åQŒé‡Œé¢æ·»åŠ ä½ éœ€è¦Locale的名字作为子目录åQŒæ¯”如en, zh_CN½{‰ã€‚需要国际化的字½W¦ä¸²éƒ½ä»¥_(â€?)来书写,比如惛_›½é™…化“编辑”这个标½{¾ï¼Œž®±å¯ä»¥åœ¨è§†å›¾çš„rhtml中ä‹É用_(”Editâ€?åQŒè¿™æ ·åœ¨æ˜„¡¤ºçš„æ—¶å€™ä¼šè‡ªåЍæ ÒŽ®Locale来替换成相应的倹{€?/font>

接着在项目的rakefile里面如下内容åQ?/font>

desc “Create mo-files for L10n�br />task :makemo do
  GetText.create_mofiles(true, “po� “locale�
end

需要注意的是在上面¾l™å‡ºçš„链接的那篇文章里面åQŒè¿˜éœ€è¦æ·»åŠ updatepo˜q™æ ·ä¸€ä¸ªç›®æ ‡ï¼Œä¸è¿‡˜q™ä¸ªç›®æ ‡åœ¨æˆ‘˜q™ä¸èµ·ä½œç”¨ï¼Œæ€ÀL˜¯å‡ºé”™åQŒæˆ‘的办法是下蝲那篇文章附带的代码: http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz 。在里面的script目录下面有一个localizeæ–‡äšgåQŒæŠŠå®ƒæ‹·è´åˆ°ä½ çš„™å¹ç›®çš„script目录下面åQŒç„¶åŽè¿è¡Œruby ./script/localize {文本域的名字}ž®±å¯ä»¥ä»Žcontrollers, views中更新po数据åQŒç”¨Unicode¾~–辑器(比如UltraEditåQ‰ä¿®æ”¹å„个poæ–‡äšgåQŒç„¶åŽè¿è¡Œrake makemož®±å¯ä»¥äº†ã€‚关于如果修改application.rb及其他controller的代码,查看¾l™å‡ºçš„链接。此旉™‡æ–°å¯åЍserveråQŒå°±å¯ä»¥æŸ¥çœ‹æ•ˆæžœäº†ã€?/font>



]]>
åŸÞZºŽRuby的元¾~–程技æœ?转蝲)http://www.aygfsteel.com/byterat/archive/2006/10/24/76886.html比特é¼?/dc:creator>比特é¼?/author>Tue, 24 Oct 2006 01:52:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/10/24/76886.htmlhttp://www.aygfsteel.com/byterat/comments/76886.htmlhttp://www.aygfsteel.com/byterat/archive/2006/10/24/76886.html#Feedback0http://www.aygfsteel.com/byterat/comments/commentRss/76886.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/76886.html原文出处: http://www.rubychina.org/viewthread.php?tid=124&extra=page%3D1

    元编½E‹åƈ不是一个很新的概念åQŒé€šå¸¸å…ƒç¼–½E‹è¢«è®¤äؓ是通过½E‹åºæ¥ç”Ÿæˆç¨‹åºï¼Œå¦‚果从这¿Uæ„ä¹‰ä¸Šæ¥è€ƒè™‘åQŒé‚£ä¹ˆlexå’Œyacc以及JavaCC应该都可以算是具有了元编½E‹çš„æ¦‚念åQŒåœ¨Java中,元编½E‹å¾—åˆîCº†òq¿æ³›çš„应用。但在Ruby中,元编½E‹çš„使用变得相当的简单和å®ÒŽ˜“实现åQŒä‹É用Ruby语言本èín来äñ”生Ruby代码åQŒä¸éœ€è¦å€ŸåŠ©å¤–éƒ¨çš„å·¥å…øP¼Œè‘—名的RoR框架ž®±æ˜¯å»ºç«‹çš„Ruby元编½E‹çš„基础上的。可能你你对元编½E‹è¿˜æ²¡ä»€ä¹ˆæ¦‚念,但是Ruby已经内徏了元¾~–程˜q™ç§æœºåˆ¶åQŒæ‰€ä»¥å¾ˆæœ‰å¯èƒ½ï¼Œä½ åœ¨ä¸çŸ¥ä¸è§‰ä¸­å°±å·²ç»ä½¿ç”¨äº†Ruby元编½E‹æŠ€æœ¯äؓ你带来的方便之处。如下面˜q™æ®µä»£ç åQ?/font>

class Person
   attr_reader :name
end
你肯定知é?:name 是和 @name 相关联的åQŒä½†æ˜¯ä½ ä¸ä¸€å®šæ¸…楚它到底是怎么实现的,其实attr_readeræ–ÒŽ³•的实现就是采用了元编½E‹æŠ€æœ¯ï¼Œå¦‚下面的˜q™æ®µä»£ç åQ?br />
class Module
    def attr_reader(*syms)
        syms.each do |sym|
            class_eval %{def #{sym}   
                             @#{sym}
                         end
        end   
    end
end

    看了˜q™æ®µä»£ç åQŒä½ åº”该大概了解元编½E‹çš„æœºåˆ¶äº†å§åQŒå¦‚果你现在˜q˜ä¸äº†è§£åQŒé‚£ä¹ˆæˆ‘廸™®®ä½ å…ˆè®¤çœŸçš„学习一下Ruby的反ž®„机åˆÓž¼Œç„¶åŽå†æŽ¥ä¸‹åŽ»çœ‹è¿™½‹‡å¸–å­ï¼Œå› äØ“ä¸‹é¢ä»‹ç»çš„å†…å®¹åÆˆä¸æ˜¯ä¸€æ¯å©´å„¿å¥¶¾_‰ã€?br />

    在Ruby On Rails中,有一个OR映射层,ž®±æ˜¯åŠ¨æ€çš„ä»Žä¸€å¼ å…³¾p»è¡¨æ˜ å°„åˆîC¸€ä¸ªå¯¹è±¡ï¼Œ˜q™ä¸»è¦ç”±ActiveRecord¾cÀL¥å®žçŽ°ã€‚åœ¨OR映射模型中,ž®†å…³¾pÀL•°æ®åº“中的关系表表映射到对象模型时åQŒå°†å…³ç³»è¡¨çš„表名映射到类名,表中的每一个元¾l„映ž®„到对应于这个类的一个对象,元组的一个字ŒDµå¯¹åº”于对象的一个属性ã€?/font>

假如我们有一个保存职员基本信息的文äšgåQŒæ–‡ä»¶çš„æ ¼å¼æ˜¯è¿™æ ïLš„åQšç¬¬ä¸€è¡Œæ˜¯æ–‡äšg内容的每个字ŒD늚„名称åQŒä»Ž½W¬äºŒè¡Œå¼€å§‹ï¼Œåˆ™æ˜¯æ¯ä¸ªèŒå‘˜çš„基本信息。现在我们有一个文件名为“employee.txt”的文äšgåQŒå…¶å†…容如下所½Cºï¼š


name,age,gender

"John", 23, "male"

"Linclon", 25, "male"


假设我们ž®Þp¦ä»Žè¿™ä¸ªæ–‡æœ¬æ–‡ä»¶ä¸­è¯Õd–数据åQŒåƈ˜q›è¡Œä¸€å®šçš„处理。如果是使用C++¾~–程åQŒä½ é¦–先一定会惛_ˆ°åº”该定义一个Employee¾c»ï¼Œç„¶åŽ˜q™ä¸ª¾cÖM¸­æœ‰name, age, gender˜q™äº›æˆå‘˜å˜é‡ã€‚但是是采用˜q™ç§æ–ÒŽ³•的话åQŒå¯ä»¥å‘玎ͼŒå¦‚果惛_œ¨èŒå‘˜ä¿¡æ¯ä¸­åŠ å…¥ä¸€ä¸ªå­—ŒDµï¼Œæ¯”如部门åQˆdepartmentåQ‰ï¼Œž®×ƒ¸å¾—不修改Employee¾cȝš„代码åQŒåœ¨Employee¾cÖM¸­å¢žåŠ ä¸€ä¸ªâ€œdepartment”成员变量,所以我们的代码是高度依赖于文äšg的具体格式,˜q™å½“然不是一个好的现象。我们希望有一¿Uæ›´½Ž€å•和优雅的方案,˜q˜æœ‰åQŒRuby动态性提高给我们一个解å†Ïx–¹æ¡ˆï¼Œä½†æ˜¯åQŒæˆ‘们应该从和下手呢åQŒè¿™ž®±éœ€è¦Ruby的元¾~–程能力ã€?/font>


    首先åQŒæˆ‘们想应该有一个职员类åQŒåœ¨Rails中,每个关系表的名称会成为类的名¿UŽÍ¼Œåœ¨è¿™é‡Œï¼Œé‡‡ç”¨¾cÖM¼¼çš„æ–¹æ³•,ž®†æ–‡æœ¬æ–‡ä»¶çš„åç§°ä½œäØ“¾cȝš„名称åQŒåœ¨Ruby中,¾cÕdåŒæ—¶ä¹Ÿæ˜¯ä¸€ä¸ªå¸¸é‡ååQŒæ‰€ä»¥ç¬¬ä¸€ä¸ªå­—母必™åÖMؓ大写åQŒæˆ‘们ä‹É用如下的代码来生成类名ã€?/font>


class_name = File.basename(file_name, ".txt").capitalize
# "employee.txt" => "Employee"
klass = Object.const_set(class_name, Class.new)



Class.new生成一个新的类åQŒè¿™ä¸ªç±»çš„名¿U°æ˜¯åŒ¿åçš„,所以采用const_set操作来绑定一个类名,变量klass是新¾cÕdž‹çš„引用ã€?/font>


生成了这个类以后åQŒéœ€è¦æƒ³˜q™ä¸ª¾cÀL·»åŠ å§“åï¼Œòq´é¾„和性别˜q™äº›å±žæ€§ï¼Œ˜q™äº›å±žæ€§çš„名称是在文本文äšg的的½W¬ä¸€è¡Œä¸­¾l™å‡ºçš„ã€?br />


data = File.new(file_name)
header = data.gets.chomp

data.close

names = header.split(",")


下面的代码给å‡ÞZº†å¦‚何生成˜q™äº›å±žæ€§ï¼Œä»¥åŠåˆå§‹åŒ–这些属性倹{€?br />


klass.class_eval do
    attr_accessor *names
            
    define_method(:initialize) do |*values|
        names.each_with_index do |name, i|
            instance_variable_set("@" + name, values )
        end
    end
    #...   
end   

现在åQŒæœ‰äº†ä¸€¾pÕdˆ—的访问子åQˆå¯è¯Õd’Œå¯å†™åQ‰ï¼Œé€šè¿‡instance_variable_setæ–ÒŽ³•åQŒåˆ¾l™æ¯ä¸ªå±žæ€§åšäº†åˆå§‹åŒ–ã€?br />

变量names是在块外部定义的åQŒç”±äºŽå—的闭合性,所以变量names在块中也是有效的。当ç„Óž¼Œä¸ÞZº†½E‹åºçš„æ¼”½Cºï¼Œåˆå®šä¹‰çš„了一个to_sæ–ÒŽ³•åQŒä»£ç å¦‚下所½Cºï¼š


    define_method(:to_s) do
        str = "<#{self.class}: "
        names.each {|name| str << "#{name}=#{self.send(name)} "}
        str + ">"
    end
    alias_method :inspect, :to_s


    完成了这些以后,对于¾cÈš„æž„造已¾låŸºæœ¬ç»“束了åQŒçŽ°åœ¨å°±éœ€è¦çœŸæ­£çš„ä»Žæ–‡æœ¬æ–‡ä»¶ä¸­è¯Õd–数据了。从文本文äšgè¯ÀL•°æ®åº”该是一个类æ–ÒŽ³•åQŒè€Œä¸æ˜¯ä¸€ä¸ªå®žä¾‹çš„æ–ÒŽ³•åQŒå…¶å®žçŽ°ä»£ç å¦‚ä¸‹åQ?br />


    def klass.read
        array = []
        data = File.new(self.to_s.downcase + ".txt")
        data.gets #throw away header
        data.each do |line|
            line.chomp!
            values = eval("[#{line}]")
            array << self.new(*values)
        end
        data.close
        return array
    end


在这个方法中åQŒä‹É用字的类名来匚w…ç›¸å…³çš„æ–‡ä»Óž¼Œæ¯”如ž®†Employee¾cÀL˜ ž®„到“employee。txt”ã€?br />

然后åQŒä»Žæ–‡äšg中读取职员信息,ç”׃ºŽ½W¬ä¸€è¡Œæ˜¯å­—段定义åQŒæ‰€ä»¥è¦èˆå¼ƒ½W¬ä¸€è¡Œæ•°æ®ã€‚从½W¬äºŒè¡Œå¼€å§‹è¯»å–数据,每读取一行数据,则构造一个Employee实例ã€?font color="black">通过上面˜q™ä¸ª½Ž€å•的例子åQŒæˆ‘们可以看出元¾~–程的功能是相当之强大的åQŒä‹É用元¾~–程技术,可以构造相当简单,优雅的解å†Ïx–¹æ¡ˆã€?/font>



]]>
Rails Installing on Windowshttp://www.aygfsteel.com/byterat/archive/2006/10/23/76680.html比特�/dc:creator>比特�/author>Mon, 23 Oct 2006 00:48:00 GMThttp://www.aygfsteel.com/byterat/archive/2006/10/23/76680.htmlhttp://www.aygfsteel.com/byterat/comments/76680.htmlhttp://www.aygfsteel.com/byterat/archive/2006/10/23/76680.html#Feedback0http://www.aygfsteel.com/byterat/comments/commentRss/76680.htmlhttp://www.aygfsteel.com/byterat/services/trackbacks/76680.html通常在Windows上安装Ruby on Rails都采用以下步�

1.安装Ruby

http://rubyforge.org/frs/?group_id=167

˜q™é‡Œæœ‰windows一键安装版æœ?/font>

2.在线安装Rails

C:\> gem install rails --include-dependencies



以上æ–ÒŽ³•在一般情况下都是可行çš? 但如果不行的è¯? ˜q˜å¯å‚照以下æ–ÒŽ³•:

1. 讉K—®:http://instantrails.rubyforge.org/wiki/wiki.pl
  
   下蝲最新版本的InstantRails

2. 解压åˆîC½ æŒ‡å®šçš„目录下, 注意, 目录å?包括路径å?不能有空æ ?br />
3. 讉K—®å…¶ä¸­çš„readme.txt, 里面详细说明了如何配¾|®å’Œ˜qè¡ŒInstantRails




比特�/a> 2006-10-23 08:48 发表评论
]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ƽ¶¥É½ÊÐ| ½­°²ÏØ| ÄϰÄÏØ| ÆæÌ¨ÏØ| ÒÇÕ÷ÊÐ| ¡×ÓÏØ| µÂÖÝÊÐ| ²áºàÏØ| ¿â¶ûÀÕÊÐ| ½­ÃÅÊÐ| »ªÝöÊÐ| Õò°²ÏØ| á¶ÑÒ| É̶¼ÏØ| ºØÖÝÊÐ| Ñ®ÑôÏØ| µ¤ÀâÏØ| Óà¸ÉÏØ| µÂÖÝÊÐ| Áúº£ÊÐ| ÓÎÏ·| ãò¶¨ÏØ| ÄÛ½­ÏØ| ¹§³Ç| Áø½­ÏØ| ²×ÖÝÊÐ| ºâ¶«ÏØ| Ǩ°²ÊÐ| »ÝÖÝÊÐ| Ò¶³ÇÏØ| ˳²ýÏØ| ½­°²ÏØ| Ѱµé| °½ººÆì| ¸ßÖÝÊÐ| É«´ïÏØ| ±ÈÈçÏØ| ×ϽðÏØ| ÈêÄÏÏØ| È«½·ÏØ| ÓݳÇÏØ|