"Ruby" (外部计算系统)
更多信息
- 支持 Ruby 版本 2.0 及更高版本.
- 参考为 ExternalEvaluate 配置 Ruby 工作流程的说明对 Ruby 进行配置并在 Wolfram 语言中使用.
ExternalEvaluate 用法
- ExternalEvaluate["Ruby",code] 在 Ruby REPL 中执行代码字符串并以 Wolfram 语言表达式的形式返回结果.
- ExternalEvaluate["Ruby""String",code] 在 Ruby REPL 中执行代码字符串并以 Wolfram 语言字符串的形式返回输出.
- ExternalEvaluate["Ruby""type",code] 中 "type" 可取的设置包括:
-
"Expression" 尝试转换为 Wolfram 语言表达式 "String" 给出外部运算器输出的原始字符串 "ExternalObject" 以 ExternalObject 的形式返回结果
支持的外部运算
- ExternalOperation["Eval","code"] 表示 "code" 的外部运算.
- ExternalOperation["Eval","code",assoc] 表示 "code" 的外部运算,参数由 assoc 给出.
- ExternalOperation["Call",func,arg1,arg2,…] 调用函数 func,给定参数为 arg1、arg2、….
- ExternalOperation["GetAttribute",obj,"attr"] 获取 obj 的属性 "attr".
- ExternalOperation["SetAttribute",obj,"attr",val] 将 obj 的属性 "attr" 设为给定值 val.
- ExternalOperation["Cast",obj,"type"]将 obj 强制设为给定的 "type".
范例
打开所有单元 关闭所有单元基本范例 (3)
ExternalEvaluate["Ruby", "2+2"]ExternalEvaluate["Ruby", "[1,2,3,4]"]类型 > 并从下拉菜单中选择 Ruby 可获取一个使用 ExternalEvaluate 进行计算的代码单元格:
范围 (27)
session = StartExternalSession["Ruby"]ExternalEvaluate[session, "true || false"]ExternalEvaluate[session, "\"hello\" + \" \" + \"world\""]ExternalEvaluate[session, "{\"one\"=>1, \"two\"=>2, \"three\"=>3}"]DeleteObject[session]会话的选项 (8)
"ReturnType" (3)
对于 Ruby 运算系统,默认返回的类型是 "Expression":
ExternalEvaluate["Ruby", "2+2"] === ExternalEvaluate["Ruby" -> "Expression", "2+2"]对于 "Expression" 返回类型,会自动导入数字、字符串、列表和关联:
ExternalEvaluate["Ruby", "[1, 2, 3]"]MatchQ[%, {__Integer}]"String" 返回类型通过调用 Ruby 方法 to_s 返回结果字符串:
ExternalEvaluate["Ruby", "[1, 2, \"א\"]"]ExternalEvaluate["Ruby" -> "String", "[1, 2, \"א\"]"]ExternalEvaluate["Ruby", "([1, 2, \"א\"]).to_s"]"Evaluator" (1)
"SessionProlog" (1)
"SessionEpilog" (1)
"Prolog" (1)
指令的选项 (10)
"Command" (3)
ExternalEvaluate["Ruby", "(1..5).to_a"]ExternalEvaluate["Ruby", <|"Command" -> "(1..5).to_a"|>]用 File 封装运行文件中的代码:
file = Export[CreateFile[], "def add2(number)
number + 2
end", "Text"]ExternalEvaluate["Ruby", {
<|"Command" -> File[file]|>,
<|"Command" -> "add2(3)"|>
}]ExternalEvaluate["Ruby", {
File[file],
"add2(3)"
}]将代码放入 CloudObject 中:
cloudObj = CloudExport["print('Hello World!')", "Text", CloudObject["hello-world-rb"]]ExternalEvaluate["Ruby", <|"Command" -> cloudObj|>];ExternalEvaluate["Ruby", cloudObj];"ReturnType" (1)
默认情况下,使用会话创建时指定的 "ReturnType" 执行该命令:
ExternalEvaluate[
{"Ruby", "ReturnType" -> "String"},
"{'a'=> 2}"
]在指令中指定 "ReturnType",覆盖会话的 "ReturnType":
ExternalEvaluate[
{"Ruby", "ReturnType" -> "String"},
{
<|"Command" -> "{'a'=> 2}"|>,
<|"Command" -> "{'a'=> 2}", "ReturnType" -> "Expression"|>
}
]"Arguments" (2)
用 "Arguments" 调用含有参数的 Ruby 函数:
ExternalEvaluate[
"Ruby",
<|"Command" -> "Proc.new {|x,y| x+y}", "Arguments" -> {2, 3}|>
]ExternalEvaluate[
"Ruby",
<|"Command" -> "Proc.new {|x| x+3}", "Arguments" -> 2|>
]如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:
ExternalEvaluate[
"Ruby",
{
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> 1|>,
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> {1}|>,
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> {{1}}|>
}
]可在 "Command" 中定义一个函数,并用 "Arguments" 调用它:
ExternalEvaluate[
"Ruby",
<|"Command" -> "lambda {|x, y| x+y}", "Arguments" -> {3, 5}|>
]可用 Rule 得到同样的结果:
ExternalEvaluate[
"Ruby",
"lambda {|x, y| x+y}" -> {1, 3}
]也可以通过创建 ExternalFunction 来传递参数:
session = StartExternalSession["Ruby"]function = ExternalFunction[session, "lambda {|x, y| x+y}"]function[1, 3]DeleteObject[session]"Constants" (1)
"TemplateArguments" (3)
运行命令时可内嵌一个 TemplateExpression:
x = RandomReal[]
ExternalEvaluate["Ruby", "1 + <* x *>"]可用 "TemplateArguments" 填充 TemplateSlot:
ExternalEvaluate[
"Ruby",
<|"Command" -> "2 + ``", "TemplateArguments" -> 1|>
]ExternalEvaluate[
"Ruby",
<|"Command" -> "(``).to_s", "TemplateArguments" -> 5|>
]如果需要传递一个列表作为第一个参数,则必须显式地用一个额外的列表将其封装起来:
ExternalEvaluate[
"Ruby",
{
<|"Command" -> "(``).to_s", "TemplateArguments" -> 1|>,
<|"Command" -> "(``).to_s", "TemplateArguments" -> {2}|>,
<|"Command" -> "(``).to_s", "TemplateArguments" -> {{3}}|>
}
]可以命名模板插槽,并用 Association 将已命名参数传递给模板:
ExternalEvaluate[
"Ruby",
<|"Command" -> "(`start`.. `end`).to_a", "TemplateArguments" -> <|"start" -> 0, "end" -> 10|>|>
]外部运算 (8)
"Eval" (1)
运行表示 Ruby 中任意代码运算的 ExternalOperation:
ExternalEvaluate["Ruby", ExternalOperation["Eval", "2+2"]]ExternalEvaluate["Ruby", ExternalOperation["Eval", "a + b", <|"a" -> 2, "b" -> 3|>]]"Call" (3)
定义一个在 Ruby 中创建函数的 ExternalOperation:
op = ExternalOperation["Eval", "Proc.new { |a, b| a + b }"]通过运行 ExternalOperation "Call" 调用函数:
call = ExternalOperation["Call", op, 1, 2]用 ExternalEvaluate 执行运算:
ExternalEvaluate["Ruby", call]"Call" 运算的任何参数都可以是 ExternalOperation:
ExternalEvaluate["Ruby", ExternalOperation["Call", op, 1, ExternalOperation["Eval", "2+2"]]]还可以通过执行以下操作直接在 ExternalEvaluate 中传递参数:
ExternalEvaluate["Ruby", op -> {1, 2}]ExternalEvaluate["Ruby", "f = Proc.new { |a, b| a + b }.call(1, 2)"]创建 Ruby 函数的 ExternalFunction:
func = ExternalFunction["Ruby", "Proc.new { |a, b| a + b }"]ExternalEvaluate["Ruby", ExternalOperation["Call", func, 1, 2]]ExternalEvaluate["Ruby", func -> {1, 2}]创建 Ruby 函数的 ExternalObject:
session = StartExternalSession["Ruby"]func = ExternalEvaluate[session, <|"Command" -> "Proc.new { |a, b| a + b }", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["Call", func, 1, 2]]ExternalEvaluate[session, func -> {1, 2}]或使用 ExternalObject 子值:
func[ExternalOperation["Call", 1, 2]]DeleteObject[session]"GetAttribute" (2)
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}];返回一个 Date 对象的 ExternalObject:
now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["GetAttribute", now, "year"]]ExternalEvaluate[session, "Date.new(2022, 10, 10).year"]DeleteObject[session]创建表日期的 ExternalObject:
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}]now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]用 ExternalOperation 获取当前的年份:
now[ExternalOperation["GetAttribute", "year"]]对于大多数运算器,"GetAttribute" 是默认运算,可以省略 ExternalOperation:
now["year"]DeleteObject[session]"SetAttribute" (1)
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}];date = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["SetAttribute", date, "year", 2024]]ExternalEvaluate[session, ExternalOperation["GetAttribute", date, "year"]]ExternalEvaluate[session, "d = Date.new(2022, 10, 10); d.instance_variable_set('@year', 2024)"]DeleteObject[session]"Cast" (1)
创建表示当前日期的 ExternalObject:
session = StartExternalSession["Ruby"];now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]用 "Expression" 以 Wolfram 语言表达式的形式返回对象:
ExternalEvaluate[session, ExternalOperation["Cast", now, "Expression"]]也可以在 ExternalObject 子值中运行 Cast 运算:
now[ExternalOperation["Cast", "Expression"]]符号 Expression 是完成相同运算的更简便的方式:
now[Expression]now[ExternalOperation["Cast", "String"]]符号 String 是完成相同运算的更简便的方式:
now[String]用 ExternalObject 返回对象:
now[ExternalOperation["Cast", "ExternalObject"]]符号 ExternalObject 是完成相同运算的更简便的方式:
now[ExternalObject]在 ExternalEvaluate 中使用 "ReturnType" 可以得到同样的结果:
ExternalEvaluate[session, <|"Command" -> now, "ReturnType" -> "String"|>]DeleteObject[session]应用 (1)
定义一个调用自定义 Ruby 函数的 Wolfram 语言函数:
session = StartExternalSession["Ruby"];evenTest = ExternalEvaluate[session, "def is_even(x)
if x%2 == 0
return true
else
return false
end
end
"]{#, evenTest[#]}& /@ Range[10]//TableFormDeleteObject[session]相关指南
-
▪
- 外部已诠释的语言接口 ▪
- 外部语言接口
相关的工作流程
- Configure Ruby for ExternalEvaluate
历史
2020年引入 (12.1)