ruby 元编制程序,ruby编制程序

来源:http://www.sh-fengwen.com 作者:驱寒暖身 人气:109 发布时间:2019-09-02
摘要:ruby和linuxshell共同编程的示例 有了shell为毛还要ruby呢?话不能这么说,有些小功能用ruby还是很方便的,比如说字符串的反转再加1功能用shell来写就比较麻烦.str="123456",我们定义一个反转

ruby和linuxshell共同编程的示例

有了shell为毛还要ruby呢?话不能这么说,有些小功能用ruby还是很方便的,比如说字符串的反转再加1功能用shell来写就比较麻烦.str="123456",我们定义一个反转后再+1的小方法:

 

2.1.5 :020 > class String
2.1.5 :021?>   def r_add_1
2.1.5 :022?>     replace reverse.each_byte.map {|byte|byte+1}.pack("c*")
2.1.5 :023?>     end
2.1.5 :024?>   end

 

执行后str变为:

 

2.1.5 :026 > "123456".r_add_1

=> "765432"

下面我们写一个脚本把shell中的变量r_add_1一下:

 

#!/opt/local/bin/bash

export id="abc123456789"  #just

cat <<EOF | ruby |read ret
 class String
  def r_add_1
   replace reverse.each_byte.map {|b|b+1}.pack("c*")
  end
 end

 puts ENV["id"].dup.r_add_1
EOF

 

执行一下看看:

 

[email protected]: ruby_src$./read.sh

[email protected]: ruby_src$echo $ret

 

[email protected]: ruby_src$

咦,为毛ret变量为空值啊?道理很简单:管道2侧是2个不同进程,加上主bash的进程,一共是3个进程。你不用指望read ret进程建立的变量会在主bash进程中生效啊!一种解决办法是用小括号强制read ret和echo在一个进程中执行以获取返回值:cat <<EOF|ruby|(read ret;echo $ret):

 

[email protected]: ruby_src$./read.sh

:98765432dcb

必须要加小括号哦,否则read ret和echo还是在2个进程,等于做无用功啊!你可以这样做:

 

[email protected]: ruby_src$my_val=$(./read.sh)

[email protected]: ruby_src$echo $my_val

:98765432dcb

这样就将返回结果保存在主bash进程中的my_val变量中了哦。或者你在while循环中自己处理吧,因为while循环和read也在一个进程里哦,改写后的shell代码如下:

 

#!/opt/local/bin/bash

export id="abc123456789" #只是示例,实际可以动态获取id的值

cat <<EOF | ruby | while read ret;do echo ">>>>" $ret;done
 class String
  def r_add_1
   replace reverse.each_byte.map {|b|b+1}.pack("c*")
  end
 end

 puts ENV["id"].dup.r_add_1
EOF

 

你要是觉得看的cat那一行太长,可以把do...done放到EOF结尾的后面,效果是一样的:

 

#!/opt/local/bin/bash

export id="abc123456789" #只是示例,实际可以动态获取id的值

cat <<EOF | ruby | while read ret
 class String
  def r_add_1
   replace reverse.each_byte.map {|b|b+1}.pack("c*")
  end
 end

 puts ENV["id"].dup.r_add_1
EOF
do 
 echo ">>>>" $ret
done

 

最后执行read.sh都会显示:

 

[email protected]: ruby_src$./read.sh

>>>> :98765432dcb

一切皆有可能!你最后肯定还会问:为毛我不用$my_val=$(ruby -e"xxx")这种纯ruby的更简单方法,而要用shell+ruby混合的复杂方法呢??答案是:我不是在举ruby+shell的例子吗!?

有了shell为毛还要ruby呢?话不能这么说,有些小功能用ruby还是很方便的,比如说字符串的反转再加1功能用s...

ruby 元编程,ruby编程

一 对象模型

kernel Module

Kernel.private_instance_methods.grep(/^pr/)

 

private method

1 如果一个方法接收者不是你自己,一定要指定一个接收者

2 私有方法 只能指定一个隐含接收者(可调超类的私有方法)

类本身是Class类的对象。类的名字是个常量

Class<Module,模块和类的名字扮演目录角色,按树形结构组织

include Module时 M被插入到祖先链中,在该类的正上方

二 方法

obj.send(:method,arg)   #动态派发 ojb.method(arg)

Module#define_method   #动态方法 代替def

string#grep(){}

def method_missing(method,*args)

   puts “you called:#{method}(#{args.join(‘, ‘)}” 

end

三 blocks

Kernel#local_variables() 跟踪绑定的名字

ruby作用域不像java/c#中嵌套 内部可以看到外面

类定义,模块定义,方法调用时 时关闭前一个作用域

instance_eval

instance_exec 可休参数

打包代码

proc lambda

&proc 代表一个代码块

proc中return 表示从定义的作用域中返回

lambda ruturn 表示中lambda中返回

元编程,ruby编程 一 对象模型 kernel Module Kernel.private_instance_methods.grep(/^pr/) private method 1 如果一个方法接收者不是你自己,一定要指定一...

本文由美高梅游戏平台网站发布于驱寒暖身,转载请注明出处:ruby 元编制程序,ruby编制程序

关键词:

最火资讯