嗨,多年来我一直想知道为什么你不能使用这种Kernel#require
方法来加载宝石。
例如,这将起作用:
#!/usr/bin/ruby -w
require 'ruby2d' # => true
Run Code Online (Sandbox Code Playgroud)
这里 require 的所有者是 Kernel:
p Object.method(:require).owner # => Kernel
p Kernel.method(:require).owner # => #<Class:Kernel>
Run Code Online (Sandbox Code Playgroud)
但这有效:
p Object.send :require, 'ruby2d' # => true
p String.send :require, 'ruby2d' # => false
p Kernel.require 'ruby2d' # => false
Run Code Online (Sandbox Code Playgroud)
或者
gem 'ruby2d' # => true
p String.send :require, 'ruby2d' # => true
p Kernel.require 'ruby2d' # => false
Run Code Online (Sandbox Code Playgroud)
[坏主意,但您可以在任何对象上发送 require 方法]
不知何故,这不起作用:
#!/usr/bin/ruby -w
p Kernel.require 'ruby2d'
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
1: …
Run Code Online (Sandbox Code Playgroud) interp1d
对于我拥有的单个数据集效果非常好,但是我有超过 500 万个数据集需要插值。
我需要三次插值,并且每个子集应该有一个插值。
现在我可以使用 for 循环来完成此操作,但是,要插入 500 万组,这需要相当长的时间(15 分钟):
interpolants = []
for i in range(5000000):
interpolants.append(interp1d(xArray[i],interpData[i],kind='cubic'))
Run Code Online (Sandbox Code Playgroud)
我想做的事情可能看起来像这样:
interpolants = interp1d(xArray, interpData, kind='cubic')
Run Code Online (Sandbox Code Playgroud)
然而这失败了,并出现错误:
ValueError: x and y arrays must be equal in length along interpolation axis.
Run Code Online (Sandbox Code Playgroud)
我的 x 数组 (xArray) 和 y 数组 (interpData) 都具有相同的尺寸...
我可以并行化 for 循环,但这只会让我的速度略有提高,我更喜欢向量化操作。
我一直在使用 SimpleDelegator 类做各种事情。但我注意到,Ruby 2.7 (ArchLinux x86_64) 没有附带 SimpleDelegator 类(也没有 Delegator)。
我的程序:
#!/usr/bin/ruby -w
class OutputDecorator < SimpleDelegator
def puts(*args)
STDOUT.write "Hello #{args.join}... It's Ruby #{RUBY_VERSION} #{RUBY_PLATFORM}\n"
end
end
$stdout = OutputDecorator.new($stdout)
$stdout.puts('Sourav')
$stdout = $stdout.__getobj__
$stdout.puts('Sourav')
Run Code Online (Sandbox Code Playgroud)
运行:
> ~/.rvm/rubies/ruby-2.4.6/bin/ruby p.rb
Hello Sourav... It's Ruby 2.4.6 x86_64-linux
Sourav
Run Code Online (Sandbox Code Playgroud)
> ~/.rvm/rubies/ruby-2.5.5/bin/ruby p.rb
Hello Sourav... It's Ruby 2.5.5 x86_64-linux
Sourav
Run Code Online (Sandbox Code Playgroud)
> ~/.rvm/rubies/ruby-2.6.3/bin/ruby p.rb
Hello Sourav... It's Ruby 2.6.3 x86_64-linux
Sourav
Run Code Online (Sandbox Code Playgroud)
> ruby p.rb
Traceback (most …
Run Code Online (Sandbox Code Playgroud) NoMethoError
to_i
因为类没有方法而引发:
[].to_i # >> NoMethodError (undefined method `to_i' for []:Array)
Run Code Online (Sandbox Code Playgroud)
毫无疑问的是,1i
有方法to_i
和to_f
,所以它响应他们.但实际上这看起来非常棘手.
1i.respond_to?(:to_i) # => true
1i.to_i # >> RangeError (can't convert 0+1i into Integer)
Run Code Online (Sandbox Code Playgroud)
Range
班级来自哪里?
以下代码工作正常:
class String
def foo
next!
end
end
puts 'hh'.foo # hi
Run Code Online (Sandbox Code Playgroud)
这个也很好:
class String
def foo
self.next
end
end
puts 'hh'.foo # hi
Run Code Online (Sandbox Code Playgroud)
但是这个没有:
class String
def bar
next
end
end
# Invalid next (SyntaxError)
Run Code Online (Sandbox Code Playgroud)
为什么Ruby在next
这里使用关键字并引发SyntaxError,即使我正在String
上课?
我们都知道有一个ENV变量。它返回一个对象。但是ENV的返回值在视觉上类似于哈希。但这不是。
例如:
> ENV
=> {"SHELL"=>"/bin/bash", "SESSION_MANAGER"=>"local/archlinux:@/tmp/.ICE-unix/613,unix/archlinux:/tmp/.ICE-unix/613", "COLORTERM"=>"truecolor", "XDG_CONFIG_DIRS"=>"/etc/xdg", "XDG_MENU_PREFIX"=>"xfce-", "SSH_AUTH_SOCK"=>"/tmp/ssh-Al0pdO1R5970/agent.622", "DESKTOP_SESSION"=>"Xfce Session", "SSH_AGENT_PID"=>"623", "GTK_MODULES"=>"canberra-gtk-module:canberra-gtk-module", "XDG_SEAT"=>"seat0", "PWD"=>"/home/sourav", "LOGNAME"=>"sourav", "XDG_SESSION_TYPE"=>"x11", "XAUTHORITY"=>"/home/sourav/.Xauthority", "HOME"=>"/home/sourav", "LANG"=>"en_GB.UTF-8", "XDG_CURRENT_DESKTOP"=>"XFCE", "VTE_VERSION"=>"5603", "INVOCATION_ID"=>"6d4dc7a91cc141e691436cb850e18f8d", "GLADE_CATALOG_PATH"=>":", "XDG_SESSION_CLASS"=>"user", "TERM"=>"xterm-256color", "USER"=>"sourav", "DISPLAY"=>":0.0", "SHLVL"=>"2", "XDG_VTNR"=>"1", "XDG_SESSION_ID"=>"1", "TILIX_ID"=>"f2480263-263e-408f-be36-8105e71256a6", "MOZ_PLUGIN_PATH"=>"/usr/lib/mozilla/plugins", "GLADE_MODULE_PATH"=>":", "XDG_RUNTIME_DIR"=>"/run/user/1000", "GLADE_PIXMAP_PATH"=>":", "JOURNAL_STREAM"=>"9:25041", "XDG_DATA_DIRS"=>"/usr/local/share:/usr/share", "PATH"=>"/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/sourav/.rvm/bin:/home/sourav/.rvm/bin:/home/sourav/.gem/ruby/2.6.0/bin", "DBUS_SESSION_BUS_ADDRESS"=>"unix:path=/run/user/1000/bus", "MAIL"=>"/var/spool/mail/sourav", "_"=>"/home/sourav/.irb", "LINES"=>"24", "COLUMNS"=>"80"}
Run Code Online (Sandbox Code Playgroud)
看起来类似于:
> ENV.to_h
=> {"SHELL"=>"/bin/bash", "SESSION_MANAGER"=>"local/archlinux:@/tmp/.ICE-unix/613,unix/archlinux:/tmp/.ICE-unix/613", "COLORTERM"=>"truecolor", "XDG_CONFIG_DIRS"=>"/etc/xdg", "XDG_MENU_PREFIX"=>"xfce-", "SSH_AUTH_SOCK"=>"/tmp/ssh-Al0pdO1R5970/agent.622", "DESKTOP_SESSION"=>"Xfce Session", "SSH_AGENT_PID"=>"623", "GTK_MODULES"=>"canberra-gtk-module:canberra-gtk-module", "XDG_SEAT"=>"seat0", "PWD"=>"/home/sourav", "LOGNAME"=>"sourav", "XDG_SESSION_TYPE"=>"x11", "XAUTHORITY"=>"/home/sourav/.Xauthority", "HOME"=>"/home/sourav", "LANG"=>"en_GB.UTF-8", "XDG_CURRENT_DESKTOP"=>"XFCE", "VTE_VERSION"=>"5603", "INVOCATION_ID"=>"6d4dc7a91cc141e691436cb850e18f8d", "GLADE_CATALOG_PATH"=>":", "XDG_SESSION_CLASS"=>"user", "TERM"=>"xterm-256color", "USER"=>"sourav", "DISPLAY"=>":0.0", "SHLVL"=>"2", "XDG_VTNR"=>"1", "XDG_SESSION_ID"=>"1", "TILIX_ID"=>"f2480263-263e-408f-be36-8105e71256a6", "MOZ_PLUGIN_PATH"=>"/usr/lib/mozilla/plugins", …
Run Code Online (Sandbox Code Playgroud) 多年来,我已经习惯了焦点跟随鼠标选项。
在 VSCode 编辑器中,我想通过简单地将光标放在集成终端和代码编写器上来在它们之间切换。
有谁知道如何在尝试在代码编写器和终端之间移动时从设置中启用焦点跟随鼠标或使用任何简单的技巧?
我正在使用此代码:
require 'benchmark'
LOOPS = 100_000_000
def while_loop
i = 0
while i < LOOPS do i += 1 end
end
def times_loop
i = 0
LOOPS.times { i += 1 }
end
Benchmark.benchmark do |b|
b.report('while') { while_loop }
b.report('times') { times_loop }
end
Run Code Online (Sandbox Code Playgroud)
输出是(Ruby 2.6.0):
while 2.419529 0.000000 2.419529 ( 2.426470)
times 7.225500 0.005673 7.231173 ( 7.252794)
Run Code Online (Sandbox Code Playgroud)
为什么while
循环比别人快?
我正在使用Ruby 2.6.3
Ruby ri将pp记录为:
以漂亮的形式打印参数。
无论如何,在文件中,当我编写并运行以下代码时:
#!/usr/bin/ruby -w
Kernel.pp 'hi'
pp 'hi'
Run Code Online (Sandbox Code Playgroud)
我收到NoMethodError。
但是以下代码如何工作?
#!/usr/bin/ruby -w
pp 'hi'
Kernel.pp 'hi'
Run Code Online (Sandbox Code Playgroud)
输出:
"hi"
"hi"
Run Code Online (Sandbox Code Playgroud)
这是截图
我正在寻找 Ruby 中所有魔法指令的列表。
例如:
#!/usr/bin/ruby -w
# encoding: windows-1252
# warn_indent: false
# frozen_string_literal: true
Run Code Online (Sandbox Code Playgroud)