Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 语法错误,实例_eval字符串中意外出现| |_Ruby - Fatal编程技术网

Ruby 语法错误,实例_eval字符串中意外出现| |

Ruby 语法错误,实例_eval字符串中意外出现| |,ruby,Ruby,我想在实例\u eval字符串中插入一个值。参数alias\u name有时可以是nil或字符串。如果为nil,则调用另一个返回字符串的方法,如下所示: def create_document(klass, alias_name) klass.instance_eval <<-EOS def alias_name #{alias_name} || name end EOS end 我正在仔细研究这段代码,没有看到语法错误。如果{ali

我想在
实例\u eval
字符串中插入一个值。参数
alias\u name
有时可以是nil或字符串。如果为nil,则调用另一个返回字符串的方法,如下所示:

def create_document(klass, alias_name)
  klass.instance_eval <<-EOS
      def alias_name
        #{alias_name} || name
      end
  EOS
end
我正在仔细研究这段代码,没有看到语法错误。如果
{alias\u name}
返回nil或string,为什么会导致错误

所有这些工作完成后:

> nil || 'something else'
 => "something else" 
> 'something' || 'something else'
 => "something" 
alias\u name
为nil时,根本不会对其求值。它就像在instance_eval字符串中不存在一样,导致语法错误。但即使这样也不行:

alias_name = alias_name || ""
klass.instance_eval <<-EOS
  def alias_name
    if #{alias_name}.present?
      #{alias_name}
    else
      demodulized_name
    end
  end
EOS

你看到了吗?它好像不存在别名。

使用字符串插值时,
“s{expr}s”
相当于:

's ' + expr.to_s + ' s'
nil.to_s
是一个空字符串,因此:

klass.instance_eval <<-EOS
  def alias_name
    #{alias_name} || name
  end
EOS
alias\u name
nil
或空字符串且:

def alias_name
  || name
end
是语法不正确的Ruby代码

你输入到klass.instance_eval的herdoc并不知道有任何特殊的“这是Ruby代码”上下文,它只是像其他任何字符串一样构建一个字符串,并在
{}
插值上盲目地调用

也许您想使用
inspect
而不是
来检查

klass.instance_eval <<-EOS
  def alias_name
    #{alias_name.inspect} || name
  end
EOS
alias\u name
nil
且:

def alias_name
  "pancakes" || name
end
alias\u name
是字符串
'pancakes'

或者,如果
别名_name
是另一个方法的名称,您可能希望在
实例_eval
之外进行测试:

if alias_name.present?
  klass.instance_eval <<-EOS
    def alias_name
      #{alias_name} || name
    end
  EOS
else
  klass.instance_eval <<-EOS
    def alias_name
      name
    end
  EOS
end
如果别名_name.present?

klass.instance_eval正是这样的问题使得
eval
成为一个棘手且可能非常危险的工具。只要有可能,尝试使用
define\u方法
system和类似
send(别名)
的方法来实现这一点。有趣的是,直到现在,我才真正理解to\u s和inspect的区别。
klass.instance_eval <<-EOS
  def alias_name
    #{alias_name.inspect} || name
  end
EOS
def alias_name
  nil || name
end
def alias_name
  "pancakes" || name
end
if alias_name.present?
  klass.instance_eval <<-EOS
    def alias_name
      #{alias_name} || name
    end
  EOS
else
  klass.instance_eval <<-EOS
    def alias_name
      name
    end
  EOS
end