ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

ruby|调用外部nodejs并处理返回结果

2021-09-13 13:05:05  阅读:193  来源: 互联网

标签:调用 eval puts nodejs pinyin cmd arr1 title ruby


最近需要在rails中写个脚本来生成汉字的拼音,找了一圈,发布在ruby里面是有拼音gem的(https://github.com/janx/ruby-pinyin),但已经太老了(6年前),所以搜了下其它语言的实现,感觉npm中的pinyin包比较合适,能够处理多音节(https://github.com/hotoo/pinyin),其返回结果正好就是数组形式,可以用ruby接受返回结果后再处理。

代码实战

title = PthSentence.last.title
dir = File.dirname(__FILE__)
cmd = "node #{File.join(dir, 'makePinyin.js')} #{title}"
puts cmd
output = `#{cmd}`

arr1 = []
arrStr = "arr1 = #{output}"
puts arrStr
eval(arrStr)
eval("puts arr1[0]")

解释下:

title = Sentence.last.title

获取到最后一个句子的标题。

如何调用nodejs

ruby中调用外部程序有三种办法:

exec

exec执行完外部程序并退出,可以作为最后一句,比如写转换视频、图像之类的脚本。

cmd = exec("echo 'hello'")
puts '-' * 20

image-20210913094212731

只会执行第一句,后面的因为已经退出程序,所以不会被执行。

system

system(command)返回的是子进程的结束状态,如果子进程正常退出(exit 0)则system返回true,否则返回false。

command = system(“touch a.rb")
puts "安哥在此"

执行后会在当前目录下新建一个touch a.rb的文件,返回true后再打印第二句。system执行完后不像exec会直接退出程序。

使用``

最方便的就是用这个得到返回结果了,比如

 cmd = `echo 'hello'`
 puts "-"*10

image-20210913094130914

``是%x{}的一种简写,与下面的结果相同:

cmd = %x{echoo 'hello'}

我的程序中为排错方便,是先输出字符串。

dir = File.dirname(__FILE__)
cmd = "node #{File.join(dir, 'makePinyin.js')} #{title}"
puts cmd
output = `#{cmd}`

执行node的时候,貌似需要使用绝对路径。

makePinyin.js如下:

var pinyin = require("pinyin")

first_arg = process.argv.slice(2)[0]
result = pinyin(first_arg, {heteronym: true,  segment: true, group:false })
console.log(result) 

判断返回是否成功

$? 表示最近一个子进程的状态

>> `echo hello`
=> "hello\n"
>> $?
=> #<Process::Status: pid 18048 exit 0>
>> $?.success?
=> true

我代码中还没有用到,记录以便以后备查。

使用eval

有了返回结果就可以用强大的eval来将字符串转化为代码执行。

arr1 = []
arrStr = "arr1 = #{output}"
eval(arrStr)
eval("puts arr1[0]")

需要你先把变量声明一次,不然会出错。不加arr1=[]时会出现这样的错误: undefined local variable or method `arr1’ for main:Object (NameError)

image-20210913100031591

运行结果

image-20210913093705937

标签:调用,eval,puts,nodejs,pinyin,cmd,arr1,title,ruby
来源: https://blog.csdn.net/weixin_42293131/article/details/120265013

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有