如何从Blockly中的input_statement获取语句堆栈?

问题描述

这是有问题的块

Screenshot

{
    "type": "local","message0": "%{BKY_LOCAL_TITLE}","args0": [
      {
        "type": "input_dummy"
      },{
        "type": "input_statement","name": "DEFINE","check": "Local"
      },{
        "type": "input_value","name": "EXPRESSION"
      }
    ],"inputsInline": true,"output": null,"style":"local_blocks" 
  }

它用于函数的本地定义。

“定义” arg包含许多功能和变量定义块。问题是,如果我尝试访问定义,无论做什么都只能获得堆栈中的第一个块。

我尝试使用statementToCode和BlockToCode直接调用

    Blockly.JavaScript.valuetoCode(block,'DEFINE',Blockly.JavaScript.ORDER_FUNCTION_CALL) ;
    
     Blockly.JavaScript.statementToCode(block,Blockly.JavaScript.ORDER_FUNCTION_CALL); 
    
     Blockly.JavaScript.blockToCode(block.getInputTargetBlock('DEFINE')); //neither works

我尝试进行for循环,但DEFINE0,DEFINE1等不存在。

那么您如何真正将块堆叠在DEFINE字段中?

编辑:我检查了block.getChildren()。length,它始终为2(因此是表达式+定义),这意味着,正如预期的那样,定义列表嵌套在第一个孩子中。

一个问题可能是定义列表是函数定义,即它们产生如下代码

Blockly.JavaScript['define_name'] = function(block) {
  
  [...]

  Blockly.JavaScript.deFinitions_['%' + name] = code;
  return null;
};

这意味着它们没有返回值。但是我仍然应该能够全部调用它们。当我使用statementToCode或类似的方法时,我确实会获得第一个定义(在图像函数local-deFinition中),而不是其余的。我交换了它们,它始终是第一个生成代码的人。

所以我真的看不到问题。在其他示例中,他们几乎什么也没做

    var branch = Blockly.JavaScript.statementToCode(block,'STACK');

那为什么在这里不起作用?

解决方法

仅供未来的考古学家使用

var define_blocks =  block.getInputTargetBlock('DEFINE');
if(define_blocks)
 do{ 
  Blockly.JavaScript.blockToCode(define_blocks);
  }while (define_blocks = define_blocks.getNextBlock());
,

对于所有想知道为什么blockToCode返回您重复代码的人-将true传递给blockToCode方法

var define_blocks =  block.getInputTargetBlock('DEFINE');
if(define_blocks)
 do{ 
  Blockly.JavaScript.blockToCode(define_blocks,true);
  }while (define_blocks = define_blocks.getNextBlock());

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...