rubyonrails入门:Ruby入门

  、思路方法

  Ruby 思路方法定义允许为参数设置默认值不过在带有默认值参数后面不能出现不带有默认值参数(允许 * 和 &)也就是说下面思路方法定义是不被允许解释时会出现 parse error 还有点和 C# 区别思路方法定义不能出现在思路方法后面

# parse error
def Display(args1="proshea", args2)
end
# 允许
def Display(args1="proshea", *args2)
end
# 允许
def Display(args1="proshea", &args)
end
Show
# 出现在 Show 的后是
def Show
end


  Ruby 也支持 C# params 这样参数功能 只是 Ruby 用 * 标识罢了

def Display(*args)
pr %Q~#{args.join("-")}~
end
# proshea-32-WinForm
Display("proshea", 32, "WinForm")


  同样 Ruby 也有类似于 C# delegate 应用只是更简单直接用 & 来表示并且 Ruby 用个称为 yield 关键字来知会解释器执行传入代码块或者说 Proc object(过程对象?)

1def Display(&block)
2 block_given?
3 yield(block)
4
5 pr %Q~没有传入过程对象~
6 end
7end
8
9def Show
10 pr %Q~Show 思路方法~
11end
12
13# 没有传入过程对象
14Display
15# 在 Display 内部 Show 思路方法
16# 注意起始大括号仍然只能和思路方法名在同
17Display{
18 Show
19}


  block_given? 是被定义在内部模块 Kernel 当中思路方法用以表明是否传入了 Proc object的后Ruby 用 yield 通知解释器执行传入 Proc过程对象也可以带有参数区别于普通思路方法是过程对象参数是位于组 | | 的中可以使用 Proc object call 思路方法来带参数过程对象

1 Employee
2 def initialize(username, age, &block)
3 @username, @age, @block = username, age, block
4 end
5
6 def Display(txt)
7 # 虽然 @block 是个例子变量但在此处定要加上大括号
8 pr "#{@block.call(txt)}: #@username-#@age"
9 end
10end
11
12emp = Employee.("proshea", 32){
13 |txt|
14 txt
15}
16emp.Display("context")


   2、BEGIN & END

  BEGIN 块

  BEGIN 块中代码在所有代码执行的前执行Ruby 允许设置多个 BEGIN 块并按出现顺序执行块中代码C# 员注意下面代码

BEGIN
{
pr "OnInit(object sender, EventArgs args)
"
}
BEGIN
{
pr "OnLoad(object sender, EventArgs args)
"
}
pr "Running"


  上面代码看上去很美吧可惜是上面代码段会出现 parse error正确代码应该是

BEGIN{
pr "OnInit(object sender, EventArgs args)
"
}
BEGIN{
pr "OnLoad(object sender, EventArgs args)
"
}
pr "Running"


  正如上面代码段所呈现只有当起始大括号和 BEGIN 标识符位于同行时块内代码才能得到正确执行同时 BEGIN 块也不受任何控制结构影响只要出现 BEGIN 块就会得到执行并且只执行

1i = 0
2while i < 10
3 # 虽然处理循环结构中但 BEGIN 块内代码仍然只执行
4 BEGIN{
5 pr "OnInit(object sender, EventArgs args)
"
6 }
7 i 1
8end
9
10 false
11 # BEGIN 完全不受 影响只要出现 BEGIN 块就会得到执行
12 BEGIN{
13 pr "OnLoad(object sender, EventArgs args)
"
14 }
15end
16
17pr "Running"


  基于只要现出 BEGIN 就会得到执行和 BEGIN 在所有代码执行的前执行原则即使 BEGIN 块前出现了代码该代码仍然会等待 BEGIN 块执行的后再执行比如下面代码段输出结果仍然是 _disibledevent=~ "1-10"



Tags:  ruby教程 rubyday rubyonrails rubyonrails入门

延伸阅读

最新评论

发表评论