2014-02-05 36 views
0

我在學習ruby,遇到了一些奇怪的東西。此代碼:變量如何具有一個值,也沒有定義?

if defined? branch 
    puts "param: #{branch}\n" 
else 
    puts "no branch! #{branch}\n" 
end 

輸出「無分支thisisateststring \ n!」,其中「thisisateststring」是已被分配給變量分支早在程序中的價值。怎麼可能變量branch可以賦值給它,但是沒有定義?

編輯:

人們似乎不理解我的問題。我不是要你弄清楚爲什麼在這個特定的例子中,else正在執行;我問的是這怎麼可能發生在一般。換句話說,在此之前需要插入哪些代碼才能導致我的情況發生?如我所說,我是ruby的新手,所以我很容易誤解一些基本的東西。我不是想解決一個具體的問題,我試圖通過更多地瞭解ruby如何工作來提高我的理解。在這種情況下,ruby如何輸出一個字符串,但仍然認爲它沒有被定義。

+2

給出完整的代碼。 –

+0

我沒有完整的代碼。這段代碼是我自己的代碼,它正在作爲別人寫的更大框架的一部分運行。我只是試圖找出如何定義一個變量,而不是同時定義。 – Benubird

+0

從我可以告訴else語句永遠不會成功運行。除非這個代碼是來自類定義或類似的東西,否則可能是第二個分支調用將通過method_missing函數來處理。 – hirolau

回答

2

@hirolau給了你一個有效的例子。我想重複使用他的想法併爲您簡化一下。請嘗試以下操作:

defined? foo 
=> nil 

foo 
NameError: undefined local variable or method 'foo' for main:Object 

def method_missing(m, *params, &block) 
    if m.to_s == "foo" 
    return "cool stuff" 
    end 
end 

# foo is still not defined 
defined? foo 
=> nil 

# but returns some value 
foo 
=> "cool stuff" 
1

一般不會,但Ruby有很多方法來處理缺少的方法和未定義的變量。考慮例如:

class Tree 
    def initialize 
    if defined? branch 
     p "param: #{branch}\n" 
     else 
     p "no branch! #{branch}\n" 
    end 
    end 

    def method_missing(method_call) 
    return 'this text comes from method_missing' 
    end 

end 

a = Tree.new #=> "no branch! this text comes from method_missing" 

class Tree 
    def branch 
    return 'NOW I HAVE MY OWN METHOD' 
    end 
end 

a = Tree.new #=> "param: NOW I HAVE MY OWN METHOD" 

有關您的問題的任何更多信息是很難給沒有語句的上下文。

+0

就是這樣,我不知道上下文......我只是想知道任何可能的方式。 – Benubird

+0

可能是這樣的,除了你的第二種情況仍在計數定義。 method_mising可以做某種查找嗎? – Benubird

+0

當然,@ Abdo的例子告訴你,它確實不需要定義。我試圖表明,只是因爲它沒有在一個點上定義,它可能以後被定義,從而使檢查有效。 – hirolau

0

defined?這個defined? Ruby關鍵字不檢查目標是否爲零,而是檢查目標是否指可識別的任何東西(文字對象,已初始化的本地變量,從當前範圍可見的方法名稱等)「。

查看文檔以瞭解其行爲。 http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-defined-3F

如果你想檢查一個變量是零,你可以這樣做:

if branch.nil? or branch.empty? 
    puts "no branch!\n" 
else 
    puts "param: #{branch}\n" 
end 
0

defined?在Ruby是一個關鍵詞。

它返回nil或描述該對象是什麼字符串。

在Ruby中,計算結果爲假的只有兩件事情是falsenil

所以,如果「東西」,你正在試圖瞭解是不確定的,那麼defined?將返回nil將評估作爲如您的問題所示,在您的代碼中爲false。

要回答你的問題:「一個變量如何具有一個值,也沒有定義?」

它不能。如果它沒有被定義爲一個變量,它甚至可能是一個變量。但它可以被定義爲一個變量,其值爲nil

+0

好吧,但它有一個價值,因爲我的看漲期權產生的產出。它可以有一個值爲零,但也是一個字符串值? – Benubird

+0

什麼是定義?回來了嗎?它可能不是一個變量,那麼,因爲一個變量只能存儲一個值(一個對象),就像一個方法只能返回一個對象一樣。因此,測試是'放入定義的?(分支),以便您可以看到該分支對象是什麼。 – vgoff

+0

http://stackoverflow.com/a/21576653/485864正是我在這裏指出的。 – vgoff