我在对cyberciti.biz的评论中看到了这个有趣的问题.
我发现我甚至找不到一种灵活的方法来用sh执行单行命令.
到目前为止,我对解决方案的想法是:
tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file
Run Code Online (Sandbox Code Playgroud)
但是你看,这不是同步的,而且很致命,它太难看了.
欢迎大家分享一下这个.:)
我有这个代码:
l = lambda { a }
def some_function
a = 1
end
Run Code Online (Sandbox Code Playgroud)
我只想a通过lambda和一个特殊的范围进行访问,该范围a已经some_function在示例中已经定义过,或者很快就会在以下相同的范围内:
l = lambda { a }
a = 1
l.call
Run Code Online (Sandbox Code Playgroud)
然后我发现在调用时l,它仍然使用自己的绑定,但不是调用它的新绑定.
然后我试着用它作为:
l.instance_eval do
a = 1
call
end
Run Code Online (Sandbox Code Playgroud)
但这也失败了,奇怪的是我无法解释原因.
我知道其中一个解决方案是使用eval,其中我可以特别绑定并在文本中执行一些代码,但我真的不想这样使用.
而且,我知道它能够使用全局变量或实例变量.但是,实际上我的代码是在更深层次的嵌入式环境中,所以如果不是非常必要,我不想打破已完成的部分.
我Proc在文档中引用了这个类,我发现了一个binding引用了Proc上下文的函数名.虽然该函数仅提供了一种访问其绑定但无法更改它的方法,除了使用Binding#eval.它也评估文本,这正是我不喜欢做的.
现在的问题是,我有更好(或更优雅)的方式来实现这个吗?或者使用eval已经是常规方式?
编辑回复@Andrew:
好的,这是我在写一个词法解析器时遇到的一个问题,我在其中定义了一个包含固定数量项的数组,其中包括至少一个Proc和一个正则表达式.我的目的是匹配正则表达式并在我的特殊范围内执行Procs,其中Proce将涉及一些应在稍后定义的局部变量.然后我遇到了上面的问题.
其实我想这是不完全一样对这个问题,因为我的是如何通过在结合到一个Proc,而不是如何把它传递出去.
@Niklas:得到你的答案,我认为这正是我想要的.它完美地解决了我的问题.
代码'////'.split('/')导致[].虽然我期待它['', '', '', '', ''].如果这是红宝石的一个特征,为什么这样设计呢?
假设我有一个包含许多字段的结构:
(struct my-struct (f1 f2 f3 f4))
Run Code Online (Sandbox Code Playgroud)
如果我要返回一个f2更新的新结构,我必须改写其他所有字段:
(define s (my-struct 1 2 3 4))
(my-struct (my-struct-f1 s)
(do-something-on (my-struct-f2 s))
(my-struct-f3 s)
(my-struct-f4 s))
Run Code Online (Sandbox Code Playgroud)
这是多余的,如果我更新字段数或更改其订单,将成为错误的来源.
我真的想知道是否有这样的方式我可以更新结构的特定字段,如:
(my-struct-f2-update (my-struct 1 2 3 4)
(lambda (f2) (* f2 2)))
;; => (my-struct 1 4 3 4)
Run Code Online (Sandbox Code Playgroud)
或者我可以将它们设置为新值:
(define s (my-struct 1 2 3 4)
(my-struct-f2-set s (* (my-struct-f2 s) 2))
;; => (my-struct 1 4 3 4)
Run Code Online (Sandbox Code Playgroud)
请注意,这不是在变异s; my-struct-f2-update并my-struct-f2-set应只是返回的副本s与f2野外进行更新.
在Haskell,我知道完成这项工作的'镜头'库.我只是想知道是否有类似的方式我可以采用球拍.谢谢.
在我(可能不正确)的理解中,以下两个列表应该是等效的:
[1, "a"] :: [forall a. Show a => a]
data V = forall a. Show a => V a
[V 1, V "a"] :: [V]
Run Code Online (Sandbox Code Playgroud)
但是,第一个不被接受,但第二个工作正常(有ExistentialQuantification).
如果第一个列表不存在,那么空白中的类型是map V :: ??? -> [V]什么?什么类型的机制强制存在包装器?
polymorphism haskell existential-type typeclass higher-rank-types
我想像许多其他语言一样在Ruby中使用重载功能,但Ruby本身不支持此功能.
我是否必须使用定义带*args参数的方法的方式来实现它,并确定方法内参数的数量和类型?有些人喜欢:
class A
def foo(*args)
case (args.length)
when 1
do something
when 2
do something-else
....
end
end
end
Run Code Online (Sandbox Code Playgroud)
你可以看到,它比直接重载更难看.
我想知道是否有任何关键字或其他方式(如元编程模块)可以让我以更优雅的方式定义重载方法.
我正在编写一个解析器来解析类似C语法的语法.
首先,它现在可以解析代码:
a = 1;
b = 2;
Run Code Online (Sandbox Code Playgroud)
现在我想在行尾添加分号可选.
最初的YACC规则是:
stmt: expr ';' { ... }
Run Code Online (Sandbox Code Playgroud)
新行由我自己编写的词法分析器处理(代码简化):
rule(/\r\n|\r|\n/) { increase_lineno(); return :PASS }
Run Code Online (Sandbox Code Playgroud)
指令:此处的PASS相当于在LEX中不返回任何内容,它会删除当前匹配的文本并跳到下一个规则,就像通常使用空格一样.
因此,我不能简单地将我的YACC规则更改为:
stmt: expr end_of_stmt { ... }
;
end_of_stmt: ';'
| '\n'
;
Run Code Online (Sandbox Code Playgroud)
所以我选择相应地通过解析器动态地改变词法分析器的状态.
像这样:
stmt: expr { state = :STATEMENT_END } ';' { ... }
Run Code Online (Sandbox Code Playgroud)
并添加一个lexer规则,可以将新行与新状态匹配:
rule(/\r\n|\r|\n/, :STATEMENT_END) { increase_lineno(); state = nil; return ';' }
Run Code Online (Sandbox Code Playgroud)
这意味着当词法分析器处于以下状态时:STATEMENT_END状态.它将像往常一样首先增加行号,然后将状态设置为初始状态,然后假装自己是分号.
奇怪的是,它实际上不适用于以下代码:
a = 1
b = 2
Run Code Online (Sandbox Code Playgroud)
我调试它并得到它实际上并没有得到';' 正如所期望的那样,在数字1之后扫描换行符,并且状态指定的规则并未真正执行.
并且设置新状态的代码在已经扫描新行并且没有返回任何内容之后执行,这意味着,这些工作按以下顺序完成:
a,=和1b …我想知道如何在Fluentd配置中使用env vars,我试过:
<match **>
type elasticsearch
logstash_format true
logstash_prefix $ENV_VAR
host ***
port ***
include_tag_key true
tag_key _key
</match>
Run Code Online (Sandbox Code Playgroud)
但它不起作用,任何想法?
我了解到Monad.Reader实际上是一个函数的封装,即:
newtype Reader r a = Reader { runReader :: r -> a }
Run Code Online (Sandbox Code Playgroud)
这是Monad的一个例子,
instance Monad (Reader r) where
return a = Reader $ \_ -> a
m >>= k = Reader $ \r -> runReader (k (runReader m r)) r
Run Code Online (Sandbox Code Playgroud)
相比之下,我知道( - >)也是Monad,
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
Run Code Online (Sandbox Code Playgroud)
从定义中可以看出它们实际上的行为完全相同.
那么它们在所有用途中都可以互换吗?不同这两个Monads的实际意义是什么?
标题中的短代码在Haskell中,它做的事情就像
list.map {|x| x + 1}
Run Code Online (Sandbox Code Playgroud)
在红宝石.
虽然我知道这种方式,但我想知道的是,是否有更优雅的方式在Haskell中实现同样的东西.
我非常喜欢to_proc红宝石中的快捷方式,就像这种形式:
[1,2,3,4].map(&:to_s)
[1,2,3,4].inject(&:+)
Run Code Online (Sandbox Code Playgroud)
但这只接受Proc和方法之间完全匹配的参数编号.
我正在尝试寻找一种允许将一个或多个参数额外传递到Proc中的方法,而不使用像第一次演示那样无用的临时块/变量.
我想这样做:
[1,2,3,4].map(&:+(1))
Run Code Online (Sandbox Code Playgroud)
红宝石有这样的举止吗?