“Dead method context” error in a function

后端 未结 2 642
不思量自难忘°
不思量自难忘° 2021-01-23 01:32

I am trying to write a isBinary function that checks sent line if it has any non-printable characters (integer value outside range 0-127):

isBinary         


        
相关标签:
2条回答
  • 2021-01-23 02:16

    Following standalone method/block code works by creating a return variable whose value is manipulated in loop if unprintable character is found. The loop is then exited:

    isBinary := [ :sline |            "WORKS"
        'Reached isBinary fn: ' display.
        ret := false.                 "return variable initialized to false"
        sline do: [ :char |           "loop for each character in sent line"
            i := char asInteger.      "convert to integer"
            i > 127                   "check if printable"
            ifTrue: [ret := true. exit]].   "ret becomes true if found unprintable; does not work if ^ symbol is used"  
        ret].            "if not found above, ret remains false; ret is returned value"
    

    Above works without creating a class as desired by OP (me!).

    0 讨论(0)
  • 2021-01-23 02:25

    Your isBinary variable is bound to a block that contains a so called non-local return, which cannot be executed the way you intend. The reason is that the semantics for a non-local return is to return from the method that defines de block (it's lexical context). If such a method does not exist or it already returned (in other words if the lexical context is not in the calling stack), there is no way to define where the execution flow should return. Hence the error.

    To solve this, just create a method #isBinary: that receives an argument sline with the code you wrote for the block. Then call the method instead of evaluating the block. That will work.

    0 讨论(0)
提交回复
热议问题