小编S.G*_*ami的帖子

为什么 Kernel#require 在 Ruby 中引发 LoadError?

嗨,多年来我一直想知道为什么你不能使用这种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)

ruby rubygems require

5
推荐指数
1
解决办法
730
查看次数

我可以矢量化 scipy.interpolate.interp1d

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 循环,但这只会让我的速度略有提高,我更喜欢向量化操作。

python scipy-optimize

5
推荐指数
1
解决办法
553
查看次数

Ruby 2.7 中的 SimpleDelegator 在哪里?

我一直在使用 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)

运行:

  • 红宝石 2.4.6:
> ~/.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)
  • 红宝石 2.5.5:
> ~/.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)
  • 红宝石 2.6.3:
> ~/.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)
  • 红宝石 2.7.0:
> ruby p.rb 
Traceback (most …
Run Code Online (Sandbox Code Playgroud)

ruby

5
推荐指数
1
解决办法
392
查看次数

为什么`1i.to_i`引发`RangeError`而不是'NoMethodError`?

NoMethoErrorto_i因为类没有方法而引发:

[].to_i # >> NoMethodError (undefined method `to_i' for []:Array)
Run Code Online (Sandbox Code Playgroud)

毫无疑问的是,1i有方法to_ito_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班级来自哪里?

ruby

4
推荐指数
1
解决办法
78
查看次数

为什么Ruby中的`next`方法会引发SyntaxError而``next!`或`self.next`在修补String类时不会这样做?

以下代码工作正常:

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上课?

ruby

3
推荐指数
1
解决办法
64
查看次数

ENV在Ruby中返回什么对象?

我们都知道有一个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)

ruby

3
推荐指数
1
解决办法
45
查看次数

在 VSCode 中的编辑器和集成终端之间启用焦点跟随鼠标

多年来,我已经习惯了焦点跟随鼠标选项。

在 VSCode 编辑器中,我想通过简单地将光标放在集成终端和代码编写器上来在它们之间切换。

例如在 Geany 编辑器中: 在此处输入图片说明

有谁知道如何在尝试在代码编写器和终端之间移动时从设置中启用焦点跟随鼠标或使用任何简单的技巧?

focus visual-studio-code

3
推荐指数
2
解决办法
639
查看次数

是什么让 Ruby 中的“while”循环比其他循环更快?

我正在使用此代码:

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
推荐指数
1
解决办法
261
查看次数

Kernel.pp在Ruby中引发NoMethodError

我正在使用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

2
推荐指数
1
解决办法
54
查看次数

Ruby 中所有魔法指令的列表

我正在寻找 Ruby 中所有魔法指令的列表。

例如:

#!/usr/bin/ruby -w
# encoding: windows-1252
# warn_indent: false
# frozen_string_literal: true
Run Code Online (Sandbox Code Playgroud)

我刚收到一个链接,提到了其中的一些。

ruby

2
推荐指数
1
解决办法
62
查看次数