给出例如:
scala> def pipes(strings:String*) = strings.toList.mkString("|")
Run Code Online (Sandbox Code Playgroud)
我可以正常打电话:
scala> pipes("foo", "bar")
res1: String = foo|bar
Run Code Online (Sandbox Code Playgroud)
或者用splat:
scala> val args = List("a","b","c")
scala> pipes(args:_*)
res2: String = a|b|c
Run Code Online (Sandbox Code Playgroud)
但是我可以使用splat为除了varargs参数之外的任何东西提供参数吗?例如,我想做类似的事情:
scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s
scala> val args:Tuple2[Int, String] = (1, "two")
scala> pipeItAfterIncrementing(args:_*)
Run Code Online (Sandbox Code Playgroud)
这不起作用,但有没有办法实现从单个对象提供多个参数的相同效果,无论是元组还是其他东西?是否有任何理由不能为元组实现,因为它们的长度和类型在编译时都是已知的?
当您按住"shift"并在Mac上用鼠标滚动时,它会将垂直滚动动作解释为水平滚动动作.这是我在linux上工作时最缺乏的功能,我很乐意把它带到linux(因为我看得很透彻,似乎没有其他人这样做过).
我希望这可以通过某种运行时插件来完成,或者至少以一种不需要我重新编译所有其他应用程序来使用它们的方式来完成.我的问题是:那里有哪些库可以编写这样的插件?编写某种脚本会很好,因为看起来功能不应该那么复杂,但如果需要,我可以用C和C++编写代码.
我已经研究过像XEvIE(已停产)和XTrap这样的X解决方案(似乎已经放弃了).我很乐意现在仅限于GTK/GNOME,至少作为概念证明.
如果这不能作为插件完成,我应该接近哪个开源项目(Xfree86?GNOME?其他人?)尝试将此功能纳入其中?
- 更新(使用解决方案!):
安装软件包"xbindkeys"和"xautomation".然后在〜/ .xbindkeysrc.scm文件中写下以下内容:
; bind shift + vertical scroll to horizontal scroll events (xbindkey '(shift "b:4") "xte 'mouseclick 6'") (xbindkey '(shift "b:5") "xte 'mouseclick 7'")
然后运行xbindkeys
说我有一个参数列表:
> (setf format-args `(t "it's ~a" 1))
(T "it's ~a" 1)
Run Code Online (Sandbox Code Playgroud)
然后,我如何将其"展开"或"展开"为一系列参数而不是单个列表参数,以提供给格式函数?即我想要进行以下函数调用:
> (format t "it's ~a" 1)
Run Code Online (Sandbox Code Playgroud)
作为参考,我将在python或ruby中编写以下内容:
format(*format-args)
Run Code Online (Sandbox Code Playgroud)
我确信它可以做到,但也许我认为这是错误的.这项行动的名称似乎没有得到很好的同意,这也无济于事......
似乎当使用基本类型(字符串,数字)作为this函数调用的主体(作为function.call()或函数apply()的第一个参数)时,基本类型被提升为其对象的等价物(例如一个字符串变成一个字符串).
为了显示:
var f = function(x) { return [typeof(this), typeof(x)]; }
var obj = '123'
f.call(obj, obj)
>>> ["object", "string"]
Run Code Online (Sandbox Code Playgroud)
也就是说,"this"成为一个对象(它是一个String对象,我已经检查过),而第二个调用参数成为函数"f"的第一个参数,并且仍然是一个原始字符串.
对象都是 "123",但微妙的东西不起作用(例如,它们在"=="方面相同,但在"==="方面则不相同).
我在chrome和firefox中都注意到了这种行为,所以我假设它有一个特定的原因.我搜索过,但没有找到任何解释.我很感激任何解释,希望通过某种方式链接到文档,解释有关此规则及其发生原因的规则.
javascript的encodeURI函数是否有用?
据我所知,当您尝试发出HTTP请求时,您应该:
在第一种情况下,显然没有什么需要做的来请求它.注意:如果您确实想将其作为参数传递(例如?url = http ...),那么您实际上有第二种情况的实例恰好看起来像一个URI.
在第二种情况下,您应始终将unicode字符串转换为UTF-8,然后在将其添加到URI之前调用encodeURIComponent以转义所有字符.(如果您有UTF-8字节序列而不是unicode字符串,则可以跳过convert-to-utf8步骤).
假设我没有错过任何东西,我看不到encodeURI的有效用途.如果你使用它,很可能你构造了一个无效的URI,然后尝试在事后"消毒"它,这是不可能的,因为你不知道哪些字符是字面上的意图,哪些是打算转义的.
我已经看到很多反对使用escape()的建议,但是没有看到任何人阻止encodeURI.我错过了有效用途吗?
所以我通过AJAX抓取RSS提要.在处理它们之后,我有一个html字符串,我想使用各种jQuery功能来操作它.为了做到这一点,我需要一个DOM节点树.
我可以将HTML字符串解析为jQuery()函数.
我可以将它作为innerHTML添加到某个隐藏节点并使用它.
我甚至尝试过使用mozilla的非标准range.createContextualFragment().
所有这些解决方案的问题在于,当我的HTML代码段有<img>标记时,firefox会尽职地提取所引用的任何图像.由于此处理是未向用户显示的后台内容,因此我想在没有浏览器加载其中包含的所有图像的情况下获取DOM树.
用javascript可以实现吗?我不介意它是否只是mozilla,因为我已经使用了javascript 1.7功能(现在似乎只是mozilla)
我有以下xsl样式表:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8"/>
<xsl:template match="/">
<xsl:variable name="elements">
<xsl:call-template name="get-some-nodes"/>
</xsl:variable>
<root>
<values>
<xsl:copy-of select="$elements"/>
</values>
<count>
<xsl:value-of select="count($elements)"/>
</count>
</root>
</xsl:template>
<xsl:template name="get-some-nodes">
<node>1</node>
<node>2</node>
<node>3</node>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
(应用它的xml无关紧要,它会生成自己的数据).
这个(使用xsltproc)的结果是:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.w3.org/1999/xhtml" xmlns:set="http://exslt.org/sets">
<values>
<node>1</node>
<node>2</node>
<node>3</node>
</values>
<count>1</count>
</root>
Run Code Online (Sandbox Code Playgroud)
鉴于被调用的模板返回三个节点,我预计"count($ elements)"为3,但它是1.我怀疑结果可能被包含在某种根节点中,但任何尝试计数($ elements/*)或类似的都失败了,我相信因为$ elements是结果树片段,而不是节点集.
我无法访问任何exslt或xslt2.0的好东西,当然有办法获取存储在变量中的节点的数量吗?
我也很乐意在不使用中间变量的情况下计算调用模板返回的节点,但我看不出这是怎么回事.
我正在尝试在GNU common lisp中使用parenscript将lisp文件编译成javascript文件.
我发现如果我尝试使用它的前缀("ps:@"),使用PS符号宏"@"不起作用.但是,如果我在尝试编译lisp文件之前使用REPL并运行(use-package:ps),一切都按预期工作(我不必使用前缀).
问题是PS包中包含冲突符号,例如:
*** - (USE-PACKAGE (#<PACKAGE PARENSCRIPT>) #<PACKAGE COMMON-LISP-USER>): 2 name conflicts remain
Which symbol with name "CHAIN" should be accessible in #<PACKAGE COMMON-LISP-USER>?
The following restarts are available:
PARENSCRIPT :R1 #<PACKAGE PARENSCRIPT>
COMMON-LISP-USER :R2 #<PACKAGE COMMON-LISP-USER>
ABORT :R3 Abort main loop
Run Code Online (Sandbox Code Playgroud)
我可以通过选择:r1以交互方式解决这个问题,但是当我尝试将此步骤放入我的脚本时它只是保释(因为它是非交互式的,它不会让我选择重启使用什么)
我想说(在我的剧本中)"只使用所有冲突符号的PS版本",但我无法弄清楚如何这样做.
如果我可以说(例如在python中),"来自PS导入链,@,(等)"也是可以的 - 指定我想手动导入的每个符号.
(摘自ocaml:在对象的方法中公开 printf 函数,因此可以独立回答)
我有以下(简化的)ocaml 代码,用于记录器:
type log_level =
| Error
| Warn
| Info
let ord lvl =
match lvl with
| Error -> 50
| Warn -> 40
| Info -> 30
let current_level = ref (ord Warn)
let logf name lvl =
let do_log str =
if (ord lvl) >= !current_level then
print_endline str
in
Printf.ksprintf do_log
Run Code Online (Sandbox Code Playgroud)
logf 函数可以与 printf 格式一起使用,如下所示:
logf "func" Warn "testing with string: %s and int: %d" "str" 42;
Run Code Online (Sandbox Code Playgroud)
有没有什么方法可以实现仅在实际需要时格式化参数的典型日志记录行为?即类似:
let …Run Code Online (Sandbox Code Playgroud)