我意识到Swift书提供了随机数生成器的实现.最好的做法是将此实现复制并粘贴到自己的程序中吗?或者是否有一个我们现在可以使用的库?
请考虑以下代码段:
class Example
def my_attr=(value)
@_my_attr = value
@_my_attr * 3
end
end
Run Code Online (Sandbox Code Playgroud)
我希望表达式Example.new.my_attr = 5返回15,但结果证明是错误的.即使我=明确调用该方法,也始终返回原始返回值:
Example.new.my_attr = 5 # => 5
Example.new.my_attr=(5) # => 5
Run Code Online (Sandbox Code Playgroud)
Ruby如何以及为什么这样做?Ruby是否会处理=特别结束的方法,还是其他机制?我想这排除了链接=方法的返回值,对吧?有没有办法让Ruby的行为有所不同,或者这是怎么回事?
更新:感谢@jeffgran:
Example.new.send(:my_attr=, 5) # => 15
Run Code Online (Sandbox Code Playgroud)
这是一种解决方法,但在另一个层面上甚至更令人困惑,因为这意味着send在行为方面显然并不总是直接调用方法.
从刚刚启动的会话中考虑以下irb片段:
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
Run Code Online (Sandbox Code Playgroud)
baz是一个未定义的变量,试图评估它产生了一个NameError.然而,不知何故,在这个操作之后,baz被定义了,并且具有值nil.看起来,即使没有人(明确地)要求它,也将值nil赋给变量baz.是否存在潜在的语言原因,为什么这种行为是可取的?
解释此行为和其他类似混淆构造的规则是什么,例如:
irb:04> true if foo # => NameError
irb:05> foo # => NameError; name still undefined
irb:06> foo = (true if foo) # => nil
irb:07> foo # => nil; name defined as nil
irb:08> true || i = 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用Sublime Text 3.我有一个布局,左边是一个屏幕高度的列,右边是三个窗格(见下图).这个设置很棒(特别是使用Golden Ratio插件),但我仍然错过了vim中的一个功能.我有一个热键导致焦点窗格占据整个窗口,就像进入该文件的全屏模式一样.完成后,您可以再次输入热键以恢复到之前的布局.这就好像保存了窗格的原始布局,并且聚焦窗格暂时占据整个窗口,当您完成全屏编辑文件时,程序会记住事情的布局并恢复到原来的状态.这是一个ASCII艺术示例:
BEFORE AFTER
---------------------------- ----------------------------
| | | | |
| | | | |
| |-------------| | |
| | | | |
| | | | |
| |-------------| | |
| | | | |
| | | | |
---------------------------- ----------------------------
Run Code Online (Sandbox Code Playgroud)
通过键入热键,您可以切换BEFORE到AFTER; 再次键入相同的热键会使您返回到BEFORE每个窗格中相同的布局和相同的选项卡.
有没有办法在Sublime Text 3中执行此操作,包括可能启用此功能的插件?如果读者知道如何编写Sublime插件,你认为编写这样一个插件有多难?我猜它不会太糟糕:在某个地方隐藏状态并以编程方式告诉Sublime在从全屏模式切换回来时恢复原状.
我在Clojure中编写了一个程序,我想在命令行上执行它,而无需在命令行上专门调用java(例如java -jar).我想要一个可执行文件,例如myprogram,接受任何参数并运行我的程序.以下是一些可能使这更容易的事情:
java位于路径中.我用一种方法走了很远的路,但我不得不怀疑是否有更好的方法.
仅供参考:我已经尝试过的
我将在下面描述我的方法,但任何答案都不需要遵循这种方法.
我所做的是创建一个lein插件,调用makescript它生成一个uberjar,base64对它进行编码,然后将它放在一个所谓的heredoc变量的Ruby脚本中,如下所示:
# ...ruby script...
BASE64_JAR = <<-JAR_BOUNDARY
# [...base64 encoded file here...]
JAR_BOUNDARY
Run Code Online (Sandbox Code Playgroud)
然后,您应该能够运行ruby脚本.它将采用BASE64_JAR变量,取消编码,将其放在临时文件中,并通过调用执行它java -jar <filename>.
我使用这种方法的问题是Ruby的base64库和Clojureclojure.data.codec.base64库似乎产生了不同的字符串来表示jar,如果我使用Ruby,Clojure编码的字符串不能解码为原始文件.这可能与两种语言之间的字符串本身(与UTF-8相关?)的编码有关.以下是说明断开连接的repl/irb会话:
repl=> (def jar-contents (slurp "../target/myproj-0.1.0-SNAPSHOT-002-standalone.jar"))
repl=> (count jar-contents) ;; => 9433328
repl=> (def a-str (String. (clojure.data.codec.base64/encode (.getBytes jar-contents)) "UTF-8"))
repl=> (count a-str) ;; => 23265576
irb> f = File.open("target/pwgen-0.1.0-SNAPSHOT-002-standalone.jar", "r").read()
irb> p f.length # => …Run Code Online (Sandbox Code Playgroud) 我试图让Haskell从文件中选择一个随机行并打印出来.我的尝试如下:
import Data.Random.Extras (choice)
main :: IO ()
main = do
filecontents <- readFile "wordlist.txt"
let words = lines filecontents
let word = choice $ words
word >>= putStrLn
Run Code Online (Sandbox Code Playgroud)
最后一行是发生错误的地方. >>=期待一个IO String,但是word是Data.RVar.RVar String.(该变量称为"word",因为每行应该是一个单词.)
我已经阅读了RVar的文档,但经过一些黑客攻击后,我看不出如何解决我的问题.有任何想法吗?
我在安装Haskell平台OS X 10.9时使用ghc 7.6.3.
完整的错误如下:
[ 01:46 PM (51) integral:thoth ~/Source/pwgen ] > ghc -o pwgen pwgen.hs
[1 of 1] Compiling Main ( pwgen.hs, pwgen.o )
pwgen.hs:40:3:
Couldn't match type `Data.RVar.RVarT
Data.Functor.Identity.Identity'
with `IO'
Expected type: IO String
Actual …Run Code Online (Sandbox Code Playgroud) ruby ×3
clojure ×1
haskell ×1
java ×1
jruby ×1
random ×1
sublimetext ×1
sublimetext3 ×1
swift ×1