当前位置:  开发笔记 > 编程语言 > 正文

检查是否定义了变量?

如何解决《检查是否定义了变量?》经验,为你挑选了9个好方法。

如何检查Ruby中是否定义了变量?有isset可用的类型方法吗?



1> Ricardo Acra..:

使用defined?关键字(文档).它将返回一个带有项目类型的String,或者nil它是否不存在.

>> a = 1
 => 1
>> defined? a
 => "local-variable"
>> defined? b
 => nil
>> defined? nil
 => "nil"
>> defined? String
 => "constant"
>> defined? 1
 => "expression"

正如skalee评论的那样:"值得注意的是,设置为nil的变量已初始化."

>> n = nil  
>> defined? n
 => "local-variable"


值得注意的是,设置为"nil"*的变量是*初始化的.
如果你想设置一个变量(如果它不存在的话),如果它存在则不管它,请参阅下面的@ danmayer的答案(涉及`|| =`运算符).
那太过分了.

2> danmayer..:

如果您确实存在则不执行任何操作,但如果它不存在则创建它,这将非常有用.

def get_var
  @var ||= SomeClass.new()
end

这只会创建一次新实例.之后它只是继续返回var.


只是不要使用带有布尔值的`|| =`,以免感到困惑的痛苦.
顺便说一句,这也是非常惯用的Ruby,非常典型.
和@AndrewMarshall所说的一样,避免这个习惯用任何可能返回"nil"的内容,除非你*真的*想要在每次调用它时返回`nil'时调用表达式

3> 小智..:

上述语句的正确语法是:

if (defined?(var)).nil? # will now return true or false
 print "var is not defined\n".color(:red)
else
 print "var is defined\n".color(:green)
end

var用你的变量替换().此语法将在if语句中返回true/false值以进行评估.


这不是必需的,因为在测试中使用时,nil评估为false

4> digitalsanct..:

defined?(your_var)将工作.根据你正在做的事情,你也可以做类似的事情your_var.nil?


`your_var.nil?`会导致错误:`未定义的局部变量或方法your_var`如果之前未定义...

5> 小智..:

尝试"除非"而不是"如果"

a = "apple"
# Note that b is not declared
c = nil

unless defined? a
    puts "a is not defined"
end

unless defined? b
    puts "b is not defined"
end

unless defined? c
    puts "c is not defined"
end


它以一种更有用的方式很好地回答了这个问题,不是吗?
红宝石风格指南说"除非为负面条件,否则支持"https://github.com/bbatsov/ruby-style-guide

6> Saqib R...:

使用defined? YourVariable
保持简单傻 ..;)



7> Sardathrion ..:

这里有一些代码,没有什么火箭科学,但它运作得很好

require 'rubygems'
require 'rainbow'
if defined?(var).nil?  # .nil? is optional but might make for clearer intent.
 print "var is not defined\n".color(:red)
else
 print "car is defined\n".color(:green)
end

显然,着色代码不是必需的,只是这个玩具示例中的一个很好的视觉效果.


@James:真的吗?Downvote而不是编辑和改变?.... meh,没关系.^ _〜

8> BKSpurgeon..:

警告Re:常见的Ruby模式

这是关键答案:defined?方法.上面接受的答案完美地说明了这一点

但是有一条鲨鱼潜伏在海浪下面......

考虑这种类型的常见ruby模式:

 def method1
    @x ||= method2
 end

 def method2
    nil
 end

method2总是回来nil.第一次调用时method1,@x变量未设置 - 因此method2将运行.并且method2将设置@xnil.那很好,一切都很好.但是第二次打电话会发生什么method1

记住@x已经设置为nil.But method2仍将再次运行!! 如果method2是一项代价高昂的工作,那么这可能不是您想要的.

defined?方法得到解决 - 使用此解决方案,处理特定情况 - 使用以下内容:

  def method1
    return @x if defined? @x
    @x = method2
  end

魔鬼在细节中:但是你可以用这种defined?方法躲避潜伏的鲨鱼.



9> 小智..:

你可以试试:

unless defined?(var)
  #ruby code goes here
end
=> true

因为它返回一个布尔值.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有