我刚遇到一个问题,函数返回的值是不同的,这取决于我是否调用puts对该结果.我想知道这是否是预期的,或某种解析器错误.
仅当传递给函数的块使用do...end语法而不是内联{...}语法时才会出现这种情况.这是一个例子:
arr = ["a", "b", "c"]
puts i = arr.index { |x| == "b" }
#=> 1
Run Code Online (Sandbox Code Playgroud)
正如所料,但这并不像我预期的那样有效:
arr = ["a", "b", "c"]
puts i = arr.index do |x|
x == "b"
end
#=> #<Enumerator:0xSomeId>
Run Code Online (Sandbox Code Playgroud)
虽然如果我这样做它可以正常工作:
arr = ["a", "b", "c"]
i = arr.index do |x|
x == "b"
end
puts i
#=> 1
Run Code Online (Sandbox Code Playgroud)
看起来它被解释为好像没有传递任何块(返回枚举器是arr.index使用块调用的预期行为).这是正常的吗?这种行为是在任何地方解释/记录的
我最近开始学习Haskell,我正在尝试重写我在Haskell中使用python进行访谈时所做的一些事情.我正在尝试将字符串从camel case转换为下划线("myVariableName" - >"my_variable_name"),如果第一个字符为大写,则会抛出错误.
这就是我所拥有的:
import qualified Data.Char as Char
translate_java :: String -> String
translate_java xs = translate_helper $ enumerate xs
where
translate_helper [] = []
translate_helper ((a, num):xs)
| num == 1 and Char.isUpper a = error "cannot start with upper"
| Char.isUpper a = '_' : Char.toLower a : translate_helper xs
| otherwise = a : translate_helper xs
enumerate :: (Num b, Enum b) => [a] -> [(a,b)]
enumerate xs = zip xs [1..]
Run Code Online (Sandbox Code Playgroud)
我意识到我很可能会以一种奇怪的方式解决这个问题,而且我喜欢有关更好的方法来实现这一点的建议,但我也希望能够编译它.这是我现在得到的错误:
Prelude> :r …Run Code Online (Sandbox Code Playgroud) 我有一个程序会执行以下操作,以等待有人按Enter退出:
spawnThreadAndDoStuff();
System.in.read();
System.exit(0);
Run Code Online (Sandbox Code Playgroud)
我想从脚本中无限期地在后台运行它,并在我希望结束时将其杀死。我以为从/ dev / null读取输入可以做到这一点,但是似乎没有用。我的脚本看起来像:
#!/bin/bash
java -cp someapp > mylog.log < /dev/null &
Run Code Online (Sandbox Code Playgroud)
我做错了吗,还是我的方法刚刚结束?解决这个问题的正确方法是什么?