byterat

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  54 随笔 :: 0 文章 :: 15 评论 :: 0 Trackbacks

#

JavaScript--正则表达式

  正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具有用正则表达式模式去匹

配或代替一个串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。

正则表达式构造函数: new RegExp("pattern"[,"flags"]);
参数说明:
pattern -- 一个正则表达式文本
flags -- 如果存在,将是以下值:
g: 全局匹配
i: 忽略大小写
gi: 以上组合

在构造函数中,一些特殊字符需要进行转意(在特殊字符前加"\")。正则表达式中的特殊字符:
字符  含意 
\ 转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为

匹配一个单词的边界。
-或-
对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/

将只匹配"a*"。 
^  匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" 
$  匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" 
*  匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa 
+  匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa 
?  匹配前面元字符0次或1次,/ba*/将匹配b,ba 
(x)  匹配x保存x在名为$1...$9的变量中 
x|y  匹配x或y 
{n}  精确匹配n次 
{n,}  匹配n次以上 
{n,m}  匹配n-m次 
[xyz]  字符集(character set),匹配这个集合中的任一一个字符(或元字符) 
[^xyz]  不匹配这个集合中的任何一个字符 
[\b]  匹配一个退格符
\b  匹配一个单词的边界 
\B  匹配一个单词的非边界
\cX  这儿,X是一个控制符,/\cM/匹配Ctrl-M 
\d  匹配一个字数字符,/\d/ = /[0-9]/ 
\D  匹配一个非字数字符,/\D/ = /[^0-9]/ 
\n  匹配一个换行符 
\r  匹配一个回车符 
\s  匹配一个空白字符,包括\n,\r,\f,\t,\v等 
\S  匹配一个非空白字符,等于/[^\n\f\r\t\v]/ 
\t  匹配一个制表符 
\v  匹配一个重直制表符 
\w  匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98" 中的5,等于[a-zA-Z0-9_] 
\W  匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。


说了这么多了,我们来看一些正则表达式的实际应用的例子:
HTML代码的屏蔽
 function mask_HTMLCode(strInput) {
   var myReg = /<(\w+)>/;
   return strInput.replace(myReg, "&lt;$1&gt;");
 }
E-mail地址验证:
 function test_email(strEmail) {
  var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
  if(myReg.test(strEmail)) return true;
  return false;
 }

 

正则表达式对象的属性及方法:
  预定义的正则表达式拥有有以下静态属性:input, multiline, lastMatch, lastParen, leftContext,

rightContext和$1到$9。其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据

不同条件赋以不同的值。许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。( JavaScript模拟perl的正则表达式)

正则表达式对象的属性:
属性 含义
$1...$9 如果它(们)存在,是匹配到的子串 
$_ 参见input 
$* 参见multiline 
$& 参见lastMatch 
$+ 参见lastParen 
$` 参见leftContext 
$''          参见rightContext 
constructor     创建一个对象的一个特殊的函数原型 
global        是否在整个串中匹配(bool型) 
ignoreCase     匹配时是否忽略大小写(bool型) 
input        被匹配的串 
lastIndex      最后一次匹配的索引 
lastParen      最后一个括号括起来的子串 
leftContext     最近一次匹配以左的子串 
multiline      是否进行多行匹配(bool型) 
prototype      允许附加属性给对象 
rightContext    最近一次匹配以右的子串 
source        正则表达式模式 
lastIndex      最后一次匹配的索引 

正则表达式对象的方法:
方法 含义
compile       正则表达式比较 
exec        执行查找 
test        进行匹配 
toSource      返回特定对象的定义(literal

representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。 
toString      返回特定对象的串。重载Object.toString方法得到的。 
valueOf       返回特定对象的原始值。重载Object.valueOf方法得到
 

例子:
<script language = "JavaScript">
var myReg = /(w+)s(w+)/;
var str  = "John Smith";
var newstr = str.replace(myReg, "$2, $1");
document.write(newstr);
</script>
将输出"Smith, John"

posted @ 2006-12-20 21:23 比特鼠 阅读(550) | 评论 (3)编辑 收藏

Expression Description
\t       Tab字符
\n       新行
.        匹配任意字符
|        匹配"左边和右边"的字符串, 例如: "ac|ad" 匹配 "ac" 和 "ad"
[]       匹配所有在 符号"[]"闭合区间内 的任意字符, 例如: "[ab]" matches "a" and "b". "[0-9]" matches any digit.
[^]      匹配所有不在  符号"[]"闭合区间内  的任意字符, 例如: "[^ab]" 匹配所有除了"a"和"b"之外的字符, "[^0-9]" 匹配所有非数字字符
*        匹配符号"*"的左边字符(0次或多次) 例如:"be*" 匹配 "b", "be" , "bee"
+        匹配符号"+"的左边字符(1次或多次) 例如:"be+" 匹配 "be" and "bee", 但不匹配 "b"
?        匹配符号"?"的左边字符(0次或1次) 例如:be?" 匹配 "b" 和 "be", 但不匹配 "bee"
^        匹配符号"^"的右边字符串, 并且该字符串必须在行首, 例如: ^AB 匹配字符串"AB",并且该"AB"必须在行首
$        匹配符号"$"的左边字符串, 并且该字符串必须在行尾, 例如: AB$ 匹配字符串"AB",并且该"AB"必须在行尾
()       Affects evaluation order of expression and also used for tagged expression.
\        Escape character. If you want to use character "\" itself, you should use "\\".


技巧:
1. 查找空行 : "^[ \t]*\n"
2. 查找行首序号: "^[0-9. ]+"
   例如: 
   "
      1. aaaa
      2. bbbb
      :
      100. abcd
      :
   "
3. 查找"["和"]"之间的内容: "\[.+\]"
4. 匹配<b></b>之间的内容(包括<b></b>):"^\<b\>.+\</b\>"
5. 匹配<b>...<br/>之间没有"/"字符的内容:"^\<b\>[^/]+\<br/\>"
   例如:
      ...
      <b>appeal</b> - v. to take to <br/>
      <b>somebody for help <br/>
      <b>appoint</b> - v. to name;<br/>
      <b>statues <br/>
      ...
      
      使用:^(\<b\>)([^/]+\<br/\>) 和替换串"\2", 将使得以上的第2行和第4行变成:
      ...
      <b>appeal</b> - v. to take to <br/>
      somebody for help <br/>
      <b>appoint</b> - v. to name;<br/>
      statues <br/>
      ...

The tagged expression is enclosed by (). Tagged expressions can be referenced by \0, \1, \2, \3, etc. \0 indicates a tagged expression representing the entire substring that was matched. \1 indicates the first tagged expression, \2 is the second, etc. See following examples.

Original Search  Replace  Result 
abc      (ab)(c) \0-\1-\2 abc-ab-c
abc      a(b)(c) \0-\1-\2 abc-b-c
abc      (a)b(c) \0-\1-\2 abc-a-c

posted @ 2006-12-20 18:18 比特鼠 阅读(473) | 评论 (0)编辑 收藏

Eclipse中常用的快捷键(最经典的快捷键,就不用多说了)

Ctrl+D: 删除当前行    

Ctrl+Alt+↓ 复制当前行到下一行(复制增加)

Ctrl+Alt+↑ 复制当前行到上一行(复制增加)

Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)

Alt+↑   当前行和上面一行交互位置(同上)

Alt+← 前一个编辑的页面

Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)

Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性

Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)

Shift+Ctrl+Enter 在当前行插入空行(原理同上条)

Ctrl+Q   定位到最后编辑的地方

Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)

Ctrl+M 最大化当前的Edit或View (再按则反之)

Ctrl+/   注释当前行,再按则取消注释

Ctrl+O   快速显示 OutLine

Ctrl+T   快速显示当前类的继承结构

Ctrl+W 关闭当前Editer

Ctrl+K   参照选中的Word快速定位到下一个

Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

Ctrl+/(小键盘) 折叠当前类中的所有代码

Ctrl+×(小键盘) 展开当前类中的所有代码

Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)

Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)

Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+F4 关闭所有打开的Editer

Ctrl+Shift+X   把当前选中的文本全部变味小写

Ctrl+Shift+Y   把当前选中的文本全部变为小写

Ctrl+Shift+F 格式化当前代码

Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)

Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)

Alt+Shift+I 合并变量(可能这样说有点不妥Inline)

Alt+Shift+V 移动函数和变量(不怎么常用)

Alt+Shift+Z 重构的后悔药(Undo)

Ctrl+Shift+U 选择选中的文字后非常类似于UE的列表查询


Eclipse启动参数大全 - -
                         
Eclipse 运行命令行参数大全
包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:
eclipse -nl en_US
将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能.

运行 Eclipse
将 Eclipse 驱动程序安装(解压缩)到某个目录(例如,c:\eclipse)中之后,通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上,该可执行文件称为 eclipse.exe,而在 Linux 系统上称为 eclipse。注意:下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。

如果您没有另行指定,则平台将缺省工作区目录创建为可执行文件的兄弟目录(例如 c:\eclipse\workspace)。此工作区目录用作项目的缺省内容区,还用于保存任何必需的元数据。要进行共享安装或多工作区安装,应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法:使用当前工作目录或使用 -data 命令行自变量。

将工作区位置设置为在当前工作目录内
在此方案中,工作区位置将是当前工作目录中称为 workspace 的目录。

实现此目的最容易的方法可能是使用下列步骤来创建快捷方式:

导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。
编辑快捷方式的属性,以使启动位置:字段标识工作区位置的父目录(例如,c:\users\robert)。
关闭属性对话框并双击快捷方式(如果提供的目录为 c:\users\robert,则工作区位置将为 c:\users\robert\workspace)。
当然,您也可以使用命令提示符(通过将目录切换为工作区父目录然后运行 eclipse.exe)来获得同样的效果。

使用 -data 设置工作区的特定位置
要使用 -data 命令行自变量,只要将 -data your_workspace_location(例如,-data c:\users\robert\myworkspace)添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。

使用 -vm 设置 java VM
建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量(例如,-vm c:\jre\bin\javaw.exe)可以实现此目的。如果不使用 -vm,则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时,它们可更改您的路径,导致在下一次启动 Eclipse 时使用另一 Java VM。

运行 Eclipse 中的高级主题
Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是:

eclipse [platform options] [-vmargs [Java VM arguments]]
Eclipse 启动参数 命令 描述 原因
-arch architecture
定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有:"x86"、"sparc"、"PA-RISC"和"ppc"。 2.0
-application applicationId
要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项,则该值会覆盖配置提供的值。如果不指定此项,则会运行"Eclipse 工作台"。 1.0
-boot bootJarURL
(建议不使用;用 -configuration 代替;支持 1.0 兼容)。Eclipse 平台的引导插件代码(boot.jar)的位置,表示为 URL。如果指定此项,则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意,不允许使用相对 URL。 *1.0
-classloaderproperties [file]
如果指定的话,则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意,不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2
-configuration configurationFileURL
Eclipse 平台配置文件的位置,表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意,不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。 2.0
-consolelog
将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0
-data workspacePath
要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-debug [optionsFile]
将平台置于调试方式,并从给定位置处的文件装入调试选项(如果指定的话)。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置,则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0
-dev [classpathEntries]
将平台置于开发方式。将可选类路径条目(用逗号分隔的列表)添加至每个插件的运行时类路径。例如,当工作区包含要开发的插件时,指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目,允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0
-endsplash params
用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0
-feature featureId
主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性,并确定使用的产品定制信息。 2.0
-keyring keyringFilePath
磁盘上授权数据库(或"密钥环"文件)的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-nl locale
定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有:"en_US"和"fr_FR_EURO"。 2.0
-nolazyregistrycacheloading
取消激活装入优化的平台插件注册表高速缓存。缺省情况下,仅当需要时才从注册表高速缓存(可用时)中装入扩展的配置元素,以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1
-noregistrycache
绕过读写内部插件注册表高速缓存文件。 2.0
-nosplash
运行平台而不显示闪屏。 1.0
-os operatingSystem
定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件,并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有:"win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0
-password password
授权数据库的密码。与 -keyring 选项配合使用。 1.0
-perspective perspectiveId
启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数,则将打开关闭时活动的透视图。 1.0
-plugincustomization   propertiesFile
包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0
-plugins pluginsFileURL
(建议不使用;用 -configuration 代替;支持 1.0 兼容)。 指定 Eclipse 平台查找插件的文件的位置,表示为 URL。该文件为属性文件格式,其中键是任意用户定义名称,值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意,不允许使用相对 URL。如果指定此项,则此选项会导致创建适当的临时配置。 *1.0
-refresh
启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0
-showlocation
用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中,此选项仅与 -data 命令行自变量一起使用。 2.0
-showsplash params
用于显示闪屏(由可执行的 Eclipse 平台启动器执行)的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0
-vm vmPath
要用来运行 Eclipse 平台的"Java 运行时环境"(JRE)的位置。如果不指定此项,则 JRE 位于 jre(它是 Eclipse 可执行文件的兄弟目录)。相对于从中启动 eclipse 的目录来解释相对路径。 1.0
-ws windowSystem
定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项,则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有:"win32"、"motif"和"gtk"。 1.0

将 -vmargs 条目后面的所有自变量(但不包括 -vmargs)作为虚拟机自变量(即,在要运行的类的前面)直接传递到所指示的 Java VM。注意:如果 Eclipse 启动在 Java vm 自变量(-vmargs)之后提供的自变量(例如,-data),则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。

在不同的 VM 上运行
在 J9 上运行 Eclipse
当在 J9 版本 1.5 上运行 Eclipse 时,建议使用以下 VM 选项:

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe         -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000
当在 J9 版本 2.0 上运行 Eclipse 时,J9W 选择的缺省自变量应为合适的选项。但是,要覆盖 Eclipse 可执行文件以内部方式自动设置的参数,必须指定 -vmargs 不带任何参数,如下所示:

eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs
有关进一步信息,参考 J9 VM 文档和帮助。

在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse
IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作,但在进行大型开发时是不够的。对于大型开发,应修改 VM 自变量以使有更多的堆可用。例如,下列设置将允许 Java 堆增大为 256MB
posted @ 2006-12-19 12:18 比特鼠 阅读(236) | 评论 (0)编辑 收藏

RubyGems是一个方便而强大的Ruby程序包管理器( package manager),类似RedHat的RPM.它将一个Ruby应用程序打包到一个gem里,作为一个安装单元。无需安装,最新的Ruby版本已经包含RubyGems了。


特点:
能远程安装包
包之间依赖关系的管理
简单可靠的卸载(uninstallation)
查询机制,能查询本地和远程服务器的包信息
能保持一个包的不同版本
基于Web的查看接口,能查看你安装的gem的信息。


使用:
1. gem query --remote        # shortcut: gem q -R
#列出所有包
2. gem query --remote --name-matches doom   # shortcut: gem q -R -n doom
#列出所有名字匹配的包
3. gem install --remote progressbar  # shortcut: gem i -r progressbar
#安装指定名字的包。
gem ins -r progressbar --version '> 0.0.1' #这里可以匹配版本
4. gem specification  progressbar  # shortcut: gem spec progressbar
#查看安装过的指定包详细信息
5.gem uninstall progressbar
#卸载包
6. gem query --local # shortcut: 'gem q -L'
#列出所有本地安装过的包
7. gem ins rake
#在本地安装,如果没有远程安装
8. gem list -b ^C
#列出所有以C开头的包
9. gem_server
开启rdoc服务。可以查看安装包的rdoc

posted @ 2006-12-15 09:53 比特鼠 阅读(2325) | 评论 (0)编辑 收藏

Tip 1. 默认情况下,Rails认为类名是单数,表明是复数形式。
如果你不喜欢这样的行为可以在配置文件(config/environment.rb)中设置一个全局标识来禁用它。
ActiveRecord::Base.pluralize_table_names = false

Tip 2.默认情况下,ActiveRecord会使用推导表明的算法,如果你不希望使用此算法可以在指定的model中使用 "set_table_name" 方法,例如:
class Sheep < ActiveRecord::Base
 set_table_name "sheep"
end

Tip 3.SQL 类型和Ruby 类型之间的对应关系可能会在 decimal 类型的精度上出现问题。SQL的 demimal,numeric,float,double 都对应 Ruby 的 Float。可以使用聚合对象 composed_of 对字段进行处理。                                                                                                                                                                                         

Tip 4.ActiveRecord会尽量的把从数据库中获取的值转换为Ruby的类型(譬如说,假设数据库字段是 timestamp 类型的,就会返回 Time 对象)。如果你希望得到一个属性的原始值,可以在属性名称后面加上 _before_type_cast.

Tip 5.Ruby 认为:除了 nil 和 false 之外的所有值都被解释为 true。所以,如果要查询一个 boolean 型字段的状态,就必须在字段名的后面加上一个问号:
user = User.find_by_name("Dave")
if user.superuser? # 不可以使用 user.superuser,否则不论数据库中存储的是数字 0、字符串 f 还是德语的 N,此条件都将成立。
 grant_privileges
end

posted @ 2006-12-15 09:30 比特鼠 阅读(283) | 评论 (0)编辑 收藏

最近一直在看Programming Ruby - 2nd, 先记录下一些不熟悉的Ruby的基本语法和操作(熟悉的就不再记啦...)

Ruby的命名:

      局部变量         全局变量      实例变量      类变量             常量和类名
==============================================================================
      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
==============================================================================


数组:

数组下标从0开始, 下标可以为负整数, 此时代表数组从最末端开始, 最末端索引从-1开始
数组的元素可以是任何类型的对象实例,包括nil实例

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

访问:
a[0]    #返回"ant"
a[1]    #返回"bee" 
a[-1]   #返回"elk"
a[-2]   #返回"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
具有"键值对"特性, key和value都可以是任何类型的实例

哈希的初始化:
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}

访问:
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 来包围起来的。通常如果是单行使用{} ,如果是多行使用do..end
代码块可以接受参数, 参数用两个竖线"|"符号来包含, 参数间用逗号","来分隔
代码块被作为一个对象传入method体中执行(如果代码块对象有参数, 则method体在执行代码块中的代码前,需要对代码块对象的参数赋值)

例如:

def test(max)
   i1, i2 = 1, 1          # parallel assignment (i1 = 1 and i2 = 1)
   while i1 <= max
      yield i1            # 也可以写成yield(i1), yield指令代表了代码块执行的位置, i1是method体中对代码块f进行了赋值
      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是特殊的method, 它在类的new操作时被执行, 用于对类实例进行初始化操作:
   def initialize(name, &block)
      @name, @block = name, block
   end

如果需要方法返回一个值, 可以显式使用return关键字, 也可以使用"默认最后一行返回值"形式:
   def meth_one
      "one"    # 相当于 return "one"
   end

如果method的声明中最后的参数带有"&"前缀(例如下例的&action), 则表示该参数接受的是代码块, 并且该代码块将被转换为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的声明中最后的参数带有"*"前缀, 表示该参数接受的是0个或多个参数(即:可变长参数), 例如:
   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


区间:

两个点创建一个"包含"区间
1..10    #包含1和10
'a'..'z'

三个点创建一个除最后一个元素外的区间
my_array = [ 1, 2, 3 ]
0...my_array.length  # 相当于0..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


待续...


posted @ 2006-11-22 11:26 比特鼠 阅读(408) | 评论 (0)编辑 收藏

1. window -- Preferences
      1.1 Content Types 
          设置相关的文件为"UTF-8", 如果在列表中没有文件后缀, 则增加相应的文件后缀.

      1.2 Workspace
          设置"Text file encoding" 为 "UTF-8".


2. Validation
      将Validator中, 除了Application client validator外的所有validator的"Manual"和"Build", 全部置空(即取消打勾)
posted @ 2006-11-08 09:44 比特鼠 阅读(265) | 评论 (0)编辑 收藏

1. 标准用法
c = Object.const_get("Array")
s = c.new

2. 使用Ruby Extension
c = Class.by_name("Array")
参见: http://extensions.rubyforge.org/rdoc/index.html

3. 通过eval 
c = eval("Array").new
posted @ 2006-10-24 12:35 比特鼠 阅读(442) | 评论 (0)编辑 收藏

Ruby on Rails是一个很不错的web开发框架,不过由于目前其本身对国际化的支持较差,所以需要一些辅助的东西来解决国际化问题。

我最先使用的是一个叫localization的插件,这个插件的使用说明在Ruby on Rails官方的wiki上面有,这个插件使用比较简单,不过功能比较弱。

目前使用的是Ruby-GetText,这个插件功能强大,基于GNU的gettext,详细的使用说明在 http://manuals.rubyonrails.com/read/chapter/105 上面有写,我大概提一下要点:

首先要是Ruby on Rails支持UTF-8,通过将如下代码添加到environment.rb中:

$KCODE = ‘u’
require ‘jcode’

接着是安装Ruby-GetText,运行gem install gettext就可以了,如果是Windows平台就选2,否则选1。接着就是在项目根目录下面创建po目录,里面添加你需要Locale的名字作为子目录,比如en, zh_CN等。需要国际化的字符串都以_(”")来书写,比如想国际化“编辑”这个标签,就可以在视图的rhtml中使用_(”Edit”),这样在显示的时候会自动根据Locale来替换成相应的值。

接着在项目的rakefile里面如下内容:

desc “Create mo-files for L10n”
task :makemo do
  GetText.create_mofiles(true, “po”, “locale”)
end

需要注意的是在上面给出的链接的那篇文章里面,还需要添加updatepo这样一个目标,不过这个目标在我这不起作用,总是出错,我的办法是下载那篇文章附带的代码: http://www.digitale-wertschoepfung.de/artikel/gettext/using-gettext-with-rails.tgz 。在里面的script目录下面有一个localize文件,把它拷贝到你的项目的script目录下面,然后运行ruby ./script/localize {文本域的名字}就可以从controllers, views中更新po数据,用Unicode编辑器(比如UltraEdit)修改各个po文件,然后运行rake makemo就可以了。关于如果修改application.rb及其他controller的代码,查看给出的链接。此时重新启动server,就可以查看效果了。

posted @ 2006-10-24 09:53 比特鼠 阅读(1160) | 评论 (2)编辑 收藏

原文出处: http://www.rubychina.org/viewthread.php?tid=124&extra=page%3D1

    元编程并不是一个很新的概念,通常元编程被认为是通过程序来生成程序,如果从这种意义上来考虑,那么lex和yacc以及JavaCC应该都可以算是具有了元编程的概念,在Java中,元编程得到了广泛的应用。但在Ruby中,元编程的使用变得相当的简单和容易实现,使用Ruby语言本身来产生Ruby代码,不需要借助外部的工具,著名的RoR框架就是建立的Ruby元编程的基础上的。可能你你对元编程还没什么概念,但是Ruby已经内建了元编程这种机制,所以很有可能,你在不知不觉中就已经使用了Ruby元编程技术为你带来的方便之处。如下面这段代码:

class Person
   attr_reader :name
end
你肯定知道 :name 是和 @name 相关联的,但是你不一定清楚它到底是怎么实现的,其实attr_reader方法的实现就是采用了元编程技术,如下面的这段代码:

class Module
    def attr_reader(*syms)
        syms.each do |sym|
            class_eval %{def #{sym}   
                             @#{sym}
                         end
        end   
    end
end

    看了这段代码,你应该大概了解元编程的机制了吧,如果你现在还不了解,那么我建议你先认真的学习一下Ruby的反射机制,然后再接下去看这篇帖子,因为下面介绍的内容并不是一杯婴儿奶粉。

    在Ruby On Rails中,有一个OR映射层,就是动态的从一张关系表映射到一个对象,这主要由ActiveRecord类来实现。在OR映射模型中,将关系数据库中的关系表表映射到对象模型时,将关系表的表名映射到类名,表中的每一个元组映射到对应于这个类的一个对象,元组的一个字段对应于对象的一个属性。

假如我们有一个保存职员基本信息的文件,文件的格式是这样的:第一行是文件内容的每个字段的名称,从第二行开始,则是每个职员的基本信息。现在我们有一个文件名为“employee.txt”的文件,其内容如下所示:


name,age,gender

"John", 23, "male"

"Linclon", 25, "male"


假设我们就要从这个文本文件中读取数据,并进行一定的处理。如果是使用C++编程,你首先一定会想到应该定义一个Employee类,然后这个类中有name, age, gender这些成员变量。但是是采用这种方法的话,可以发现,如果想在职员信息中加入一个字段,比如部门(department),就不得不修改Employee类的代码,在Employee类中增加一个“department”成员变量,所以我们的代码是高度依赖于文件的具体格式,这当然不是一个好的现象。我们希望有一种更简单和优雅的方案,还有,Ruby动态性提高给我们一个解决方案,但是,我们应该从和下手呢,这就需要Ruby的元编程能力。


    首先,我们想应该有一个职员类,在Rails中,每个关系表的名称会成为类的名称,在这里,采用类似的方法,将文本文件的名称作为类的名称,在Ruby中,类名同时也是一个常量名,所以第一个字母必须为大写,我们使用如下的代码来生成类名。


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



Class.new生成一个新的类,这个类的名称是匿名的,所以采用const_set操作来绑定一个类名,变量klass是新类型的引用。


生成了这个类以后,需要想这个类添加姓名,年龄和性别这些属性,这些属性的名称是在文本文件的的第一行中给出的。


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

data.close

names = header.split(",")


下面的代码给出了如何生成这些属性,以及初始化这些属性值。


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   

现在,有了一系列的访问子(可读和可写),通过instance_variable_set方法,又给每个属性做了初始化。

变量names是在块外部定义的,由于块的闭合性,所以变量names在块中也是有效的。当然,为了程序的演示,又定义的了一个to_s方法,代码如下所示:


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


    完成了这些以后,对于类的构造已经基本结束了,现在就需要真正的从文本文件中读取数据了。从文本文件读数据应该是一个类方法,而不是一个实例的方法,其实现代码如下:


    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


在这个方法中,使用字的类名来匹配相关的文件,比如将Employee类映射到“employee。txt”。

然后,从文件中读取职员信息,由于第一行是字段定义,所以要舍弃第一行数据。从第二行开始读取数据,每读取一行数据,则构造一个Employee实例。通过上面这个简单的例子,我们可以看出元编程的功能是相当之强大的,使用元编程技术,可以构造相当简单,优雅的解决方案。

posted @ 2006-10-24 09:52 比特鼠 阅读(476) | 评论 (0)编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页